簡體   English   中英

遍歷HashSet(Java)中的唯一對

[英]Iterating over unique pairs in a HashSet (Java)

我想遍歷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個元素。

如果克隆了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
            }
        }

或者您可以使用and數組並對其進行迭代。

如果生成對的順序無關緊要,則可以使用以下代碼,該代碼避免了必須在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++;
}

如果您不更改迭代器(只想保存狀態)

最好的方法是在這里進行每個循環

我希望迭代器僅適用於我通過該集合循環修改集合的情況。 例如,此迭代器的remove()方法。

我認為最好的方法是:

    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,並且每次通過哈希表進行迭代時都將從LinkedList中刪除第一個元素

用Java克隆任何東西都不是好習慣。 參見例如Clone()vs Copy構造函數-在Java中推薦

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM