
[英]Can an empty Iterator be used to concat with another iterator in Java
[英]Can't reference previously used elements in an iterator (java)
当我使用迭代器遍历条目集的元素时,我无法引用之前已被迭代的元素。 这是更具体的问题:
public void adjSetter(HashMap<ArrayList<Integer>,miniSquare> mp) {
Iterator it = mp.entrySet().iterator();
while (it.hasNext()) {
System.out.println("Hi~!");
Map.Entry pair = (Map.Entry)it.next();
ArrayList<Integer> lis=(ArrayList<Integer>)pair.getKey();
System.out.println(lis.get(0) + " " + lis.get(1) + "Yerr");
miniSquare minSqua=(miniSquare)pair.getValue();
if((minSqua.yCord!=600)){
lis.set(1,minSqua.yCord+50);
minSqua.topSquare=mp.get(lis);
System.out.println("This Square is " + minSqua.xCord + " " +minSqua.yCord + " and its top square is " + lis.get(0) + " " + lis.get(1) + " And it's actually " + minSqua.topSquare.xCord + " " + minSqua.topSquare.yCord ); }
if(minSqua.yCord!=250){
lis.set(1,minSqua.yCord-50);
minSqua.bottomSquare=mp.get(lis);
System.out.println("This Square is " + minSqua.xCord + " " + minSqua.yCord + " and its bottom square is " + lis.get(0) + " " + lis.get(1) + " And it's actually " + minSqua.bottomSquare.xCord + " " + minSqua.bottomSquare.yCord );
}
if(minSqua.xCord!=550){
lis.set(1,minSqua.yCord);
lis.set(0,minSqua.xCord+50);
minSqua.rightSquare=mp.get(lis);
System.out.println("This Square is " + minSqua.xCord + " " + minSqua.yCord + " and its right square is " + lis.get(0) + " " + lis.get(1) + " And it's actually " + minSqua.rightSquare.xCord + " " + minSqua.rightSquare.yCord );
lis.set(0,450); lis.set(1,450); //The error line
System.out.println(mp.get(lis).xCord+ "Yerd");}
if(minSqua.xCord!=200){
lis.set(1,minSqua.yCord);
lis.set(0,minSqua.xCord-50);
minSqua.leftSquare=mp.get(lis);
System.out.println("This Square is " + minSqua.xCord + " " + minSqua.yCord + " and its left square is " + lis.get(0) + " " + lis.get(1) + " And it's actually " + minSqua.leftSquare.xCord + " " + minSqua.leftSquare.yCord );// This line throws a null pointer exception if the other problem line is deleted
}
}
}
通过键(450,450)遍历元素后,该行
lis.set(0,450); lis.set(1,450);
产生一个空指针异常。 任何人都可以帮助您了解如何解决此问题,甚至是真正的问题所在吗? 很抱歉,如果没有足够的信息,或者代码难以阅读。
我不确定您得到NullPointerException
的确切原因,但是您滥用HashMap
。 即使您没有遍历HashMap
的条目,更改Map
的键(在您的情况下为ArrayList<Integer>
)也会破坏HashMap
,因为它会更改已经在其中的键的hashCode()
。 Map
(这意味着密钥可能存储在与其新的hashCode()
不匹配的存储桶中)。
这可能会破坏迭代器代码,并导致NullPointerException
。 您不应该更改HashMap
的键。 如果您不遍历条目,则可以从Map
删除该条目,对键进行突变,然后将其放回Map
,但是在遍历Map
不允许这样做。
PS,而不是使用原始的Iterator
和Map.Entry
,后者需要稍后进行转换,请使用:
Iterator<Map.Entry<ArrayList<Integer>,miniSquare>> it = mp.entrySet().iterator();
和
Map.Entry<ArrayList<Integer>,miniSquare> pair = it.next();
这不会解决您的异常,但这是一个好习惯。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.