我想迭代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个元素。
答案 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