我有一个Tuple
对象,其中包含3个基元:Tuple(double, long, long)
。为了避免创建大量Tuple
,我正在考虑使用Trove库的原始MAP,它将两个原语作为键和值。就我而言,它将是Map<double, some primitive>
。
我的问题:是否可以有效地将两个long
编码为一个我可以存储在地图中的基元,然后解码它们?
答案 0 :(得分:7)
是否可以有效地将两个long编码为单个原语
不,仅仅因为long是64位,并且没有Java原语比这长。你需要一个128位的原语来编码两个long。
答案 1 :(得分:1)
您可以使用Trove的双对象映射并将两个long编码为BigInteger,但如果您的目标是严格遵守原始类型,那显然没有任何帮助。
答案 2 :(得分:1)
是的,你不能将两个64位基元打包成另一个基元,最多为64位。标准double
和long
都由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[]>
。虽然Double
和long[]
不是严格原始的,但可能适合。请记住,您不能将double
(small-d)放入Map中,因为Maps只能包含引用类型,而不是基元。
或者,Map(Double, Pair)
怎么样,Pair
是一个容纳两个长片的小班?大多数图书馆都有类似的东西。