我有一個可容納3個原語的Tuple
對象:Tuple(double, long, long)
。爲了避免創建大量的Tuple
,我在考慮使用Trove庫的原始MAP,這需要兩個原始的鍵和值。在我的情況下,它將是Map<double, some primitive>
。在java中將兩個long代碼編碼到另一個原語中
我的問題:是否可以有效地將兩個long
編碼成一個我可以存儲在地圖中的原始碼,然後解碼它們?
我有一個可容納3個原語的Tuple
對象:Tuple(double, long, long)
。爲了避免創建大量的Tuple
,我在考慮使用Trove庫的原始MAP,這需要兩個原始的鍵和值。在我的情況下,它將是Map<double, some primitive>
。在java中將兩個long代碼編碼到另一個原語中
我的問題:是否可以有效地將兩個long
編碼成一個我可以存儲在地圖中的原始碼,然後解碼它們?
這是正確的,你不能打包兩個64位原語到另一個原語,最多64位的大小。按標準,double
和long
均由64個二進制數字映射。
的問題是,是否可以施加一些限制上的號你正在處理。如果你知道,你將永遠有甚至號碼或不均勻號碼或第一組件將具有整數範圍或你所面對的是1000衆人,你可以在這裏贏得一些位。
實事求是地講,你將永遠不會利用一切
對長值的2^64×2^64種組合
的。
另一方面,處理值對映射沒什麼大不了的。這就是爲了使像Java這樣的面嚮對象語言不僅能夠處理struct
之類的數據類型而且還要將方法綁定到數據的全部工作。 您可以在Web中找到Pair類的良好實現,例如angelikalanger.com。或者您可以自己編寫實現代碼,特別是,因爲您只需要一對Long
值。
同樣考慮使用Pair<Double, Pair<Long, Long>>
或者實現Tuple<M,N,T>
類,而不是按照Pair<M,N>
實現的大綱,而不是Map,即鍵值組合。
最後,您甚至可以使用內存數據庫(如H2)來保存您的Tuple(double, long, long)
條目。將它作爲Java庫封裝在您的項目中並正確配置就足夠了。
順便提一下,一個三元組被稱爲三元組。因此,您可以正確呼叫您的class Triple(double, long, long)
或更好Triple(Double, Long, Long)
。
如果我知道兩個「長」都是正數(0〜2^63-1)會怎樣? –
如果兩個數字都是正數,那麼您將贏得兩位,每位一位。 (然後你可以將它們都存儲在126位中。)如果你將它們打包到BigInteger中,或者使用本地(機器)數據結構,那麼這隻會影響你。 –
您的陳述非常天真。在混沌理論或壓縮法等信息理論領域,將使用(原始)值中的所有位,即使不使用2^65個不同的值,您使用的少數值也具有完整的128位熵意味着所有的128位應該被考慮在內並且是不可壓縮的。後一種說法也意味着即使給定127位,第128位也是不可預知的(除非熵是127位或更少) –
,纔有可能有效地兩個長編碼成一個單一的原始
沒有,只是因爲多頭是64位,並沒有Java原始長於。你需要一個128位的原語來編碼兩個long。
你可以使用Trove的雙對象映射,並將兩個longs編碼成一個BigInteger,但如果你的目標是嚴格保持原始類型,那顯然沒有任何幫助。
正如Joonas所說,沒有一個單一的基元會保存128位。什麼可能滿足您的需要是使用一個數組來保存兩個長整數:Map<Double, long[]>
。雖然Double
和long[]
不是嚴格的可能適合的原語。請記住,您不能將double
(small-d)放入地圖中,因爲地圖只能包含引用類型,而不能包含引用類型。
或者,Map(Double, Pair)
怎麼樣,其中Pair
是一個小型的持有兩個多頭?大多數圖書館都有類似的東西躺在某處。
也許你可以存儲你所有元組的double [],long [],long []數據。 –
元組按「double」排序,「long」只是關聯的信息。 –