在Java中将两个long编码到另一个原语中

时间:2011-08-01 18:32:55

标签: java primitive

我有一个Tuple对象,其中包含3个基元:Tuple(double, long, long)。为了避免创建大量Tuple,我正在考虑使用Trove库的原始MAP,它将两个原语作为键和值。就我而言,它将是Map<double, some primitive>

我的问题:是否可以有效地将两个long编码为一个我可以存储在地图中的基元,然后解码它们?

4 个答案:

答案 0 :(得分:7)

  

是否可以有效地将两个long编码为单个原语

不,仅仅因为long是64位,并且没有Java原语比这长。你需要一个128位的原语来编码两个long。

答案 1 :(得分:1)

您可以使用Trove的双对象映射并将两个long编码为BigInteger,但如果您的目标是严格遵守原始类型,那显然没有任何帮助。

答案 2 :(得分:1)

是的,你不能将两个64位基元打包成另一个基元,最多为64位。标准doublelong都由64位二进制数字映射。

问题是,您是否可以对正在处理的数字强加一些限制。如果您知道,您将始终拥有偶数数字或不均匀的数字,或者第一个组件将具有整数范围,或者您正在处理大量的1000 ,你可以在这里赢得一些比特。

实际上,您永远不会使用所有

  

2 ^ 64 x 2 ^ 64种组合

对长值。

另一方面,处理值对的映射并不是什么大不了的事。这就是使像Java这样的面向对象语言不仅处理 C 中的struct等数据类型,而且还将方法绑定到数据的全部工作。 您可以在Web中找到Pair类的良好实现,例如angelikalanger.com。或者您可以自己轻松编写实现代码,特别是,因为您只需要一对Long值。
还可以考虑使用Pair<Double, Pair<Long, Long>>或立即实现Tuple<M,N,T>类一个地图,即键值组合,遵循Pair<M,N>实施的大纲。

最后,您甚至可以使用像<{3}}这样的内存数据库来保存您的Tuple(double, long, long)条目。只需将它作为Java库包含在项目中并正确配置即可。

顺便说一句, 3元组被称为三元组。因此,您可以正确地呼叫class Triple(double, long, long)或更好Triple(Double, Long, Long)

答案 3 :(得分:0)

正如Joonas所说,没有单一的原语能容纳128位。可能满足您需求的是使用数组来保存两个长点:Map<Double, long[]>。虽然Doublelong[]不是严格原始的,但可能适合。请记住,您不能将double(small-d)放入Map中,因为Maps只能包含引用类型,而不是基元。

或者,Map(Double, Pair)怎么样,Pair是一个容纳两个长片的小班?大多数图书馆都有类似的东西。