Java 哈希集的随机起始索引迭代器

Java 哈希集的随机起始索引迭代器,java,data-structures,Java,Data Structures,我对add()使用HashSet;删除();清除();迭代器()方法。到目前为止,一切都很顺利。但是,现在我需要满足一个不同的要求 我希望能够从某个索引开始迭代。例如,我希望以下两个程序具有相同的输出 计划1 Iterator it=map.iterator(); for(int i=0;i<100;i++) { it.next(); } while (it.hasNext()) { doSomethingWith(it.next()); } 我不想使用程序1的原因是它会产生

我对
add()使用HashSet;删除();清除();迭代器()方法。到目前为止,一切都很顺利。但是,现在我需要满足一个不同的要求

我希望能够从某个索引开始迭代。例如,我希望以下两个程序具有相同的输出

计划1

Iterator it=map.iterator();
for(int i=0;i<100;i++)
{
    it.next();
}
while (it.hasNext())
{
  doSomethingWith(it.next());
}
我不想使用程序1的原因是它会产生不必要的开销。根据我的研究,我找不到一种实用的方法来创建一个带有起始索引的迭代器

所以,我的问题是,在最小化开销的同时,实现目标的好方法是什么


谢谢。

您可以使用导航地图。如果你可以依靠钥匙(并且从某个钥匙开始),那是开箱即用的

Map<K,V> submap = navigableMap.tailMap(fromKey);
Map submap=navigableMap.tailMap(fromKey);
然后,您将使用生成的子映射简单地获取迭代器()并完成您的工作。 否则,如果必须从某个索引开始,则可能需要使用临时列表

K fromKey = new ArrayList<K>( navigableMap.keySet() ).get(index);
K fromKey=newarraylist(navigableMap.keySet()).get(index);

然后按上述方式获取子映射。

哈希集没有顺序。因此,您可以将集合放入一个可以使用索引的列表中

例如:

HashSet set = new HashSet();
//......
ArrayList list = new ArrayList(set);

add()
remove()
HashSet
中速度快是有原因的。您正在用将集合中的元素作为随机访问列表的能力来换取速度和内存成本

恐怕你不能真正做到这一点,除非你先把你的集合转换成一个列表。这很简单,但通常涉及对集合中所有元素的完整处理。如果您希望能够从同一状态的某个位置多次启动迭代器,这可能是有意义的。如果不是这样,你可能会更好地使用你目前的方法

现在来看代码(假设
Set=newhashset();
是您声明的数据结构:

List<Integer> list = new ArrayList<Integer>(set);
list.subList(100, list.size()).iterator(); // this will get your iterator.
List List=newarraylist(set);
list.subList(100,list.size()).iterator();//这将获取迭代器。

由于
哈希集的迭代器不按特定顺序生成项目,因此从开头还是从结尾删除100个项目实际上没有什么区别

从末尾删除项目会更快

Iterator it = map.iterator();
int n = map.size() - 100;
for (int i = 0; i < n; i++)
    doSomethingWith(it.next());
Iterator it=map.Iterator();
int n=map.size()-100;
对于(int i=0;i
遵循@toader的建议

for(Integer i : new ArrayList<Integer>(set).subList(100, set.size())) {
   // from the 100'th value.
}
for(整数i:newarraylist(set).subList(100,set.size())){
//从第100个值开始。
}

注意:第n个值对于哈希集没有任何意义。也许您需要一个SortedSet,在这种情况下,第100个值将是第100个最大值。

您希望使用什么样的数据结构?数据结构只要支持上面列出的操作就没有关系。但是,我更希望它更快(复杂性更低)而不是简单的数组列表。
for(Integer i : new ArrayList<Integer>(set).subList(100, set.size())) {
   // from the 100'th value.
}