[英]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.