我需要一个节省空间的集合来存储大量原始int
(s)(大约800,000个整数),这样可以快速操作contains()
&允许按照定义的顺序进行迭代。
检查列表中是否存在int的更快contains()
操作是主要优先级,因为这是非常频繁的。
我愿意使用广泛使用的&受欢迎的第三方图书馆,如Trove,Guava&这样的人。
我看过Trove的TIntSet,但我相信不会让我无论如何都要定义迭代的顺序。
收集的大小约为800,000英镑。
集合中的值范围将从0到Integer.Max_VALUE
。迭代的顺序实际上应该基于我将值添加到集合的顺序,或者我可以只提供有序的int []&它应该以相同的顺序迭代。
答案 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
可能就是你要找的东西。在内部,它维护两个结构 - HashSet
和LinkedList
,允许快速'contains()'(来自前者)和定义的迭代顺序(来自后者)。
答案 4 :(得分:-1)
只需使用ArrayList<Integer>
。