我有一个可容纳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”只是关联的信息。 –