如何为List<HashSet<Integer>>集合创建Iterator?
解决Java中
List<HashSet<Integer>>迭代器创建错误的问题 我来帮你梳理下问题所在,以及怎么修正:
首先看你最初尝试的代码:
Iterator Iterator<HashSet<Integer>> iterator = new list.iterator()
这里有两个致命的语法错误:
- 重复的类型声明:你把
Iterator写了两次,正确的泛型迭代器声明应该是Iterator<HashSet<Integer>>,不需要前面再额外加Iterator - 多余的
new关键字:list.iterator()方法本身就会返回一个已经实例化好的迭代器对象,不需要用new来创建
再看你代码片段里的Iterator<HashSet<Integer>> iter = basketList.iterator();,其实这行语法本身是正确的,报错大概率是你之前写代码时犯了上面的错误,或者是在逻辑上的问题(比如你在settingBasket方法里先获取了迭代器,再往列表里加元素,这时候之前的迭代器会因为列表结构改变而失效)。
下面是修正后的完整代码,我还添加了迭代器的正确使用示例:
import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Scanner; public class Test { private static List<HashSet<Integer>> basketList = new ArrayList<>(); private static Map<Integer, Integer> map = new HashMap<>(); public static void settingBasket(String fname) throws FileNotFoundException { Scanner scan = new Scanner(new File(fname)); int n = Integer.parseInt(scan.next()); for (int i = 0; i < n; i++) { scan.next(); int m = Integer.parseInt(scan.next()); HashSet<Integer> elems = new HashSet<>(); for (int j = 0; j < m; j++) { elems.add(Integer.parseInt(scan.next())); } basketList.add(elems); } // 正确获取迭代器:此时列表已经有元素了 Iterator<HashSet<Integer>> iter = basketList.iterator(); while (iter.hasNext()) { HashSet<Integer> currentBasket = iter.next(); // 在这里处理每个HashSet的逻辑,比如打印元素 System.out.println(currentBasket); } } public static void settingPair() { // 如果你只是需要遍历列表,用增强for循环更简洁(底层也是迭代器实现) for (HashSet<Integer> basket : basketList) { // 处理逻辑 } // 当然也可以手动用迭代器 Iterator<HashSet<Integer>> iter = basketList.iterator(); while (iter.hasNext()) { HashSet<Integer> basket = iter.next(); // 处理逻辑 } } }
额外提醒几个注意点:
- 不要在获取迭代器之后,再对列表进行
add/remove操作(除非用迭代器自己的remove()方法),否则会抛出ConcurrentModificationException - 增强for循环是迭代器的语法糖,代码更简洁,适合大多数遍历场景,如果不需要手动控制迭代器的移动,优先用它
内容的提问来源于stack exchange,提问作者김규덕
相关产品推荐
相关产品推荐

