嗨,我正在做一些关于数组列表和HashMap的培训。
我正在用BufferedReader解析一个文件,将每一行添加到ArrayListreadList,现在我想创建一个HashMap<String;>map,其中Key为readList项,Value为行数。
当我使用Lambda命令时,打印k,v一切正常。然而,当我试图使用迭代器保存k,v变量,我得到一个NoSuchElementException错误。我做错了什么?(仅供参考,当我删除文件中的空行,一切工作正常)
String sourceFile = "newtestfile.txt";
BufferedReader br = new BufferedReader(new FileReader(sourceFile));
String line = br.readLine();
ArrayList<String> readListe = new ArrayList<>();
while(line != null){
readListe.add(line);
line = br.readLine();
}
HashMap<String,Integer> map = new HashMap<>();
for(int i = 0; i<readListe.size() ;i++){
map.put(readListe.get(i), i+1);
}
//map.forEach((k,v) -> System.out.println(k));
Iterator<Map.Entry<String,Integer>> iterator2 = map.entrySet().iterator();
while(iterator2.hasNext()){
String key = iterator2.next().getKey();
int value = iterator2.next().getValue();
System.out.println(key + " " + value);
}
**Source file:**
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren
NewLine ipsum dolor sit amet, consetetur sadipscing elitr,
This is line 3
//EMPTY LINE
John Doe
//END OF FILE
在你的while(iterator2.hasNext())
循环中,你调用iterator2.next()
两次,这意味着迭代器每次前进两次。
如果出现空行,则输入的行数为奇数,这意味着最后一次通过while循环时没有元素可用于iterator2.next().getValue()
调用。
最好使用"for-each"成语:
for (Map.Entry<String, Integer> e: map.entrySet()) {
String key = e.getKey();
int value = e.getValue();
System.out.println(key + " " + value);
}
除了Thomas的回答之外,还有另外两种方法可以遍历Map
的条目:
// Iterator and for-loop
for (Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator(); it.hasNext(); ) {
Map.Entry<String, Integer> e = it.next();
String key = e.getKey();
int value = e.getValue();
System.out.println(key + " " + value);
}
// forEach with lambda
map.forEach((key, value) -> System.out.println(key + " " + value));