用于存储原始int的集合,允许更快的contains()&有序迭代

时间:2012-04-26 11:27:23

标签: java collections guava trove4j

我需要一个节省空间的集合来存储大量原始int(s)(大约800,000个整数),这样可以快速操作contains()&允许按照定义的顺序进行迭代。

检查列表中是否存在int的更快contains()操作是主要优先级,因为这是非常频繁的。


我愿意使用广泛使用的&受欢迎的第三方图书馆,如Trove,Guava&这样的人。

我看过Trove的TIntSet,但我相信不会让我无论如何都要定义迭代的顺序。

编辑:

收集的大小约为800,000英镑。 集合中的值范围将从0到Integer.Max_VALUE。迭代的顺序实际上应该基于我将值添加到集合的顺序,或者我可以只提供有序的int []&它应该以相同的顺序迭代。

5 个答案:

答案 0 :(得分:5)

作为数据结构,我会选择 longs数组(我在逻辑上将其视为两个整数)。 high-int部分(位63-32)表示您添加到集合的 int值。在迭代时,low-int部分(位31-0)表示后继的索引。如果您有800.000个唯一整数,则需要创建一个800.000的长数组。

现在,您将数组组织为由值排序的二进制平衡树。左边是较小的值,右边是较高的值。您还需要两个跟踪值:一个int指向要开始迭代的第一个索引,一个int指向最后插入的值的索引。

每当您添加新值时,重新组织二进制平衡树并从指向当前添加值的最后一个值(作为索引)更新指针。

将此值(数组和两个int值)包装为您选择的集合。

使用此数据结构,您可以获得 O(log(n))的搜索性能以及两倍于值大小的内存使用量。

答案 1 :(得分:3)

由于这是数据库,但是您需要更直接的方法,请使用java.nio的memory mapped文件。特别是800_000英寸的自定义排序将不会这样做。包含可以通过内存中的BitSet实现,但与文件中的顺序并行。

答案 2 :(得分:1)

您可以使用2 Sets根据哈希值(例如TIntSet)设置一组用于快速contains操作。另一个是基于像TreeSet这样的树结构设置的,以特定的顺序迭代 当你需要添加int时,你可以同时更新两个集合。

答案 3 :(得分:0)

听起来LinkedHashSet可能就是你要找的东西。在内部,它维护两个结构 - HashSetLinkedList,允许快速'contains()'(来自前者)和定义的迭代顺序(来自后者)。

答案 4 :(得分:-1)

只需使用ArrayList<Integer>