在哈希集中的唯一对上迭代(Java)

在哈希集中的唯一对上迭代(Java),java,iterator,Java,Iterator,我想迭代散列集中的唯一对,理想情况下,我能够复制迭代器,当它耗尽自己时,迭代我正在复制的迭代器,但迭代器不喜欢被复制,我怀疑这是有原因的,但我不知道这是什么 更具体地说,是什么阻止了这种(以下)行为得到支持 Iterator<Object> iter = myhash.iterator(); while(iter.hasNext()){ object=iter.next(); Iterator<Object> iterclone = iter.clone(

我想迭代散列集中的唯一对,理想情况下,我能够复制迭代器,当它耗尽自己时,迭代我正在复制的迭代器,但迭代器不喜欢被复制,我怀疑这是有原因的,但我不知道这是什么

更具体地说,是什么阻止了这种(以下)行为得到支持

Iterator<Object> iter = myhash.iterator();
while(iter.hasNext()){
    object=iter.next();
    Iterator<Object> iterclone = iter.clone();
    while(iterclone.hasNext()){
        setOfObjectPairs.add(object,iterclone.next());
    }
}
Iterator iter=myhash.Iterator();
while(iter.hasNext()){
object=iter.next();
迭代器iterclone=iter.clone();
while(iterclone.hasNext()){
添加(对象,iterclone.next());
}
}

编辑:这样做的目的是保存迭代器的当前状态,它已经指向第i个元素。

如果克隆了迭代器,并且克隆修改了基础Iterable,则原始迭代器将抛出ConcurrentModificationException

您只需对同一集合使用另一个迭代器即可

Iterator<Object> iter = h.iterator();
        while(iter.hasNext()){
            Object o=iter.next();
            Iterator<Object> iterclone = h.iterator();
            while(iterclone.hasNext()){
                //logic
            }
        }
Iterator iter=h.Iterator();
while(iter.hasNext()){
对象o=iter.next();
迭代器iterclone=h.Iterator();
while(iterclone.hasNext()){
//逻辑
}
}

或者您可以使用and数组并对其进行迭代。

如果生成对的顺序无关紧要,那么您可以使用以下代码,以避免在O(n*n)时间内仍在运行的情况下克隆迭代器:

HashSet=newhashset();
对于(int i=0;i<10;i++){
增加(i);
}
int到=0;
for(int a:set){
int指数=0;
for(int b:set){
如果(索引+>=to){
打破
}
系统输出打印项次(a+“,”+b);
}
to++;
}

如果您不想更改迭代器(您只想保存状态)

我想最好的方法就是在这里使用for-each循环

我希望迭代器仅适用于通过此集合在循环中修改集合的情况。例如,从此迭代器中删除()方法

我认为最好的办法是:

    HashSet<Integer> set = new HashSet<Integer>();
    for (int i = 0; i < 10; i++) {
        set.add(i);
    }
    LinkedList<Integer> arr = new LinkedList<Integer>(set);
    for (Integer i : set) {
        arr.pollFirst();
        for (Integer k : arr) {
            System.out.println(i + " " + k);
        }
    }
HashSet=newhashset();
对于(int i=0;i<10;i++){
增加(i);
}
LinkedList arr=新的LinkedList(集合);
for(整数i:set){
arr.pollFirst();
for(整数k:arr){
System.out.println(i+“”+k);
}
}
在这里,您将hashset设置为LinkedList,并且每次迭代hashset时都从LinkedList中删除第一个元素


用Java克隆任何东西都不是好的做法。例如,请参见

这将无效,因为您仍然会重复计算。关键是将迭代器克隆到它当前指向的位置。在这种情况下,您可以编写自己的迭代器。或者,您可以将您的哈希集添加到ArrayList中并使用listIterator(索引)。如果您描述如何编写我自己的迭代器,使此功能存在,这样我就不必对此进行研究,我将接受您的答案。实现迭代器非常简单。。。实现接口迭代器,然后实现IDE所抱怨的方法。:)但是,这不是适合您使用的工具。除此之外,你不应该在你得到真正好的理由之前优化你的代码。在这之前,一切都是关于可读性的。这很简单。正如Zimi所说,您只需实现接口迭代器并实现方法。由于您想要创建克隆,因此可以实现clonable接口并重写clone方法。但这是你最不想做的事。我会使用数组迭代选项,您能描述一下您想在
逻辑中做什么吗?也许有一种更简单的方法来解决这个问题。@ThomasMueller请参见编辑。我想我的观点是,如果可以使用并发迭代器,为什么不能使用克隆迭代器呢?我想,
java.util.
库的作者只是认为克隆迭代器不是一个重要的用例。我认为他们是对的:如果
Iterator
Cloneable
,那么每个实现都必须支持这一点,
Iterator
有很多实现,其中很多都是用户定义的。当然,但我自己不能很好地复制Iterator中字段的值,我也不能从旧的迭代器构造新的HashKeyIterator,因为它是私有的。@Zackkenyon我的观点是:不要尝试克隆迭代器。简单地接受这样一个事实,即没有(好的)方法来解决问题,并使用不同的方法来解决你的问题。试图对藏书库做一些它不是为之设计的事情只会给你带来麻烦。我通常不是一个容易放弃的人,但我看不出有其他办法。相反,我专注于你的问题(你问题的标题),并提供了解决方案。如果您愿意,您可以问另一个问题“如何克隆迭代器”,但请不要改变问题的主题。问题的标题是“在哈希集中迭代唯一对(Java)”,但现在我们为您提供了一些解决方案,但您没有接受其中任何一个,甚至没有投票支持它们,但是,你应该坚持你想要“克隆一个迭代器”(因为现在这就是你想要的,而且你似乎不再对如何在对上迭代感兴趣)。
    HashSet<Integer> set = new HashSet<Integer>();
    for (int i = 0; i < 10; i++) {
        set.add(i);
    }
    LinkedList<Integer> arr = new LinkedList<Integer>(set);
    for (Integer i : set) {
        arr.pollFirst();
        for (Integer k : arr) {
            System.out.println(i + " " + k);
        }
    }