[英]Why is the internal data of BitSet in java stored as long[] instead of int[] in Java?
[英]Handling Long data with BitSet in Java
我有一个范围从 0 到 Long.MAX_VALUE 的大型数据集,
并想使用 BitSet 搜索任何重复项。
虽然 Java BitSet 不允许长时间使用其功能。
是否可以使用 BitSet 实现?
// incoming data have range 0 to 9,223,372,036,854,775,807 (Long max value)
// e.g. 1, 3, 5, 1, 2_000_000_000, 2_000_000_000
// expected output: 1, 2_000_000_000, as they appear twice
long[] myData = new long[]{1, 3, 5, 1, 2_000_000_000, 2_000_000_000};
// int[] myData = new int[]{1, 3, 5, 1}; // it working well for int array
BitSet bs = new BitSet();
for(int i = 0; i < myData.length; i++) {
if(bs.get(myData[i])) { // fail here as bitset only accept int
System.out.println("duplicated number: " + myData[i]);
} else {
bs.set(myData[i]); // same here
}
}
可以通过查看先前设置的位来使用BitSet
。 这将构成重复值。 但是,您不能将 position 设置为大于 Integer.MAX_VALUE (并且处理这么大的多头范围是不可行的)。 所以它不适用于您建议的范围。 而且我认为您仍然想记录重复项。
我会使用Map<Long,Long>
进行频率计数。 然后,您可以确定提供的每个值的确切计数。 并且定位 map 的下一个 Key 与计算哪个内部 long 值保存所需位相当。 所以我不相信性能是这里的一个因素。
如果您只是想消除重复项,则只需将它们放入Set<Long>
根据您的评论,查看这个在 BitSet 中保存一个大值的简单测试。
BitSet bitSet = new BitSet();
bitSet.set(Integer.MAX_VALUE);
long[] backingArray = bitSet.toLongArray();
System.out.printf("Size of backing array = %,d longs.%n",backingArray.length);
印刷
Size of backing array = 33,554,432 longs.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.