迭代HashSet中的唯一对(Java)

时间:2014-01-29 05:58:41

标签: java iterator

我想迭代HashSet中的唯一对,理想情况下,我能够制作迭代器的副本,当它耗尽自身时,迭代我正在复制的迭代器,但是迭代器不喜欢被复制,我怀疑这是有充分理由的,但我不知道那是什么。

更具体地说,是什么阻止了这种(下面)行为的支持?

Iterator<Object> iter = myhash.iterator();
while(iter.hasNext()){
    object=iter.next();
    Iterator<Object> iterclone = iter.clone();
    while(iterclone.hasNext()){
        setOfObjectPairs.add(object,iterclone.next());
    }
}

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

3 个答案:

答案 0 :(得分:0)

如果您克隆了Iterator并且克隆修改了底层的Iterable,则原始Iterator将抛出ConcurrentModificationException。

您可以简单地为同一组使用另一个迭代器。

Iterator<Object> iter = h.iterator();
        while(iter.hasNext()){
            Object o=iter.next();
            Iterator<Object> iterclone = h.iterator();
            while(iterclone.hasNext()){
                //logic
            }
        }

或者您可以使用和数组并迭代它。

答案 1 :(得分:0)

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

HashSet<Integer> set = new HashSet<Integer>();
for (int i = 0; i < 10; i++) {
    set.add(i);
}
int to = 0;
for (int a : set) {
    int index = 0;
    for (int b : set) {
        if (index++ >= to) {
            break;
        }
        System.out.println(a + ", " + b);
    }
    to++;
}

答案 2 :(得分:0)

如果你不改变迭代器(你只想保存状态)

最好的方法是在这里做,每个循环,我猜

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

我认为最好的方法是:

    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);
        }
    }

在这里你要处理你对LinkedList的hashset,你每次迭代hashset时都会从LinkedList中删除第一个元素

用Java克隆任何东西都不是好习惯。请参阅示例Clone() vs Copy constructor- which is recommended in java