项目场景:
今天在做有关迭代器的遍历中遇到了NoSuchElementException异常
问题描述:
集合中是有五个数据,当遍历了两个时,抛出了此异常
public static void main(String[] args) {
ArrayList arrayList = generate();
answer4(arrayList);
}
//随机生成1000个(0~100)的数存入ArrayList中
public static ArrayList generate(){
Random random = new Random();
ArrayList<Integer> arrayList = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
arrayList.add(random.nextInt(101));
}
return arrayList;
}
//获取出现最多的五个值 (数字:xx 出现:xx)
public static void answer4(ArrayList<Integer> arrayList){
HashMap<Integer, Integer> hashMap = new HashMap<>();
for (Integer i:arrayList) {
if(!hashMap.containsKey(i)){
hashMap.put(i,1);
}else {
hashMap.put(i, hashMap.get(i)+1);
}
}
PriorityQueue<Map.Entry<Integer,Integer>> queue = new PriorityQueue<>(5, new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
return o1.getValue()-o2.getValue();
}
});
Iterator<Map.Entry<Integer, Integer>> iterator = hashMap.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<Integer, Integer> next = iterator.next();
if(queue.size()<5)
queue.add(next);
else {
if(queue.peek().getValue()<next.getValue()){
queue.remove();
queue.add(next);
}
}
}
Iterator<Map.Entry<Integer, Integer>> iterator1 = queue.iterator();
while (iterator1.hasNext()){
System.out.println("数字:"+iterator1.next().getKey()+" 次数:"+iterator1.next().getValue());
}
}
原因分析:
在遍历中,一个while中出现了多次 .next() 方法
Iterator<Map.Entry<Integer, Integer>> iterator1 = queue.iterator();
while (iterator1.hasNext()){
System.out.println("数字:"+iterator1.next().getKey()+" 次数:"+iterator1.next().getValue());
}
}
解决方案:
在一个while中,只出现一次 .next() 方法即可
Iterator<Map.Entry<Integer, Integer>> iterator1 = queue.iterator();
while (iterator1.hasNext()){
Map.Entry<Integer, Integer> next = iterator1.next();
System.out.println("数字:"+next.getKey()+"次数:"+next.getValue());
//System.out.println("数字:"+iterator1.next().getKey()+" 次数:"+iterator1.next().getValue());
}