Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 适用于随机访问且无重复的正确数据结构_Java_Data Structures - Fatal编程技术网

Java 适用于随机访问且无重复的正确数据结构

Java 适用于随机访问且无重复的正确数据结构,java,data-structures,Java,Data Structures,我需要在某些数据结构中存储唯一的对象,但也需要像ArrayList或普通数组那样通过索引进行访问。也许有一些优雅的方法可以做到这一点,而不需要使用从集合到数组的转换、通过所有元素的迭代、在添加到ArrayList和其他元素时检查值。 如果您能提供任何帮助和建议,我将不胜感激 创建自己的类,其中包含一个哈希集和一个数组列表。对于add/append操作,如果元素不在集合中,则将其追加到列表并将其添加到哈希集合。您将使用大约两倍于普通ArrayList的内存,但您将获得O(1)随机访问和包含操作。您

我需要在某些数据结构中存储唯一的对象,但也需要像ArrayList或普通数组那样通过索引进行访问。也许有一些优雅的方法可以做到这一点,而不需要使用从集合到数组的转换、通过所有元素的迭代、在添加到ArrayList和其他元素时检查值。
如果您能提供任何帮助和建议,我将不胜感激

创建自己的类,其中包含一个
哈希集
和一个
数组列表
。对于
add
/
append
操作,如果元素不在集合中,则将其追加到列表并将其添加到哈希集合。您将使用大约两倍于普通ArrayList的内存,但您将获得
O(1)
随机访问和包含操作。

您应该从以下方面了解:

修饰另一个集合,以确保迭代器保留并使用加法顺序

如果第二次将对象添加到集合中,它将在迭代中保持在原始位置。可以通过迭代器或toArray方法从集合中观察顺序

ListOrderedSet还有各种有用的直接方法。其中包括列表中的许多项,如get(int)、remove(int)和indexOf(int)。可以通过asList()获取集合的不可修改列表视图


您能解释一下为什么需要索引访问,以及索引代表什么吗?你可以通过一个散列集进行顺序迭代,所以你不需要随机访问/索引。为什么需要两倍的数量?它应该只是指向同一对象的两个指针否,在这种情况下,它将取决于对象的大小,但不会像double那样糟糕,如果对象很大,它可能几乎是相同的。@Nirfiedman
ArrayList
由最差的数组支持。我没有深入研究
HashSet
的实现,但我相信至少会有
1.333n
个bucket(默认负载因子为
0.75
)。此组合数据结构将使用
O(n)
内存,但合理的估计是
ArrayList
内存的两倍。不过,你说的对象的大小将主导指针的大小可能是正确的。