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