如何通过方法遍历多个预定义ArrayList?求正确实现方案
解决动态遍历多个ArrayList的问题
嘿,我懂你现在的困扰——你想通过字符串数组里的集合名称,依次遍历对应的ArrayList,但原来的代码直接把字符串赋值给ArrayList变量肯定跑不起来,毕竟String类型和ArrayList
方案一:用Map关联集合名称和ArrayList对象
这种方式最贴合你原来的想法,把每个ArrayList和它的名称绑定在一起,之后通过名称就能拿到对应的集合:
首先,你需要在初始化那些ArrayList的地方,把它们存入一个Map(可以把Map定义成类的成员变量,或者和ArrayList一起声明):
// 定义Map来存储集合名称和对应的ArrayList Map<String, ArrayList<String>> arrayListMap = new HashMap<>(); // 初始化各个ArrayList后,将它们放入Map ArrayList<String> KEYWORDS = new ArrayList<>(); // 给KEYWORDS添加元素... arrayListMap.put("KEYWORDS", KEYWORDS); ArrayList<String> CUSTOMERS = new ArrayList<>(); // 给CUSTOMERS添加元素... arrayListMap.put("CUSTOMERS", CUSTOMERS); // 剩下的SYSTEM_DEPS、MODULES等集合也按同样方式放入Map
然后修改你的遍历方法,通过Map获取对应的集合:
public void genericForEachLoop(POITextExtractor te) { final String[] tagArrays = {"KEYWORDS", "CUSTOMERS", "SYSTEM_DEPS", "MODULES", "DRIVE_DEFS", "PROCESS_IDS"}; for(String tagName : tagArrays) { System.out.println(tagName); // 通过名称从Map中取出对应的ArrayList ArrayList<String> currentList = arrayListMap.get(tagName); // 加个空判断,避免集合不存在时出现空指针异常 if(currentList != null) { for (String item : currentList) { if (te.getText().contains(item)) { System.out.println(item); } } } } }
方案二:直接把ArrayList存入数组(更简洁)
如果不需要打印集合的名称,或者可以接受不通过字符串名称来引用集合,那直接把所有ArrayList放进数组里遍历会更简单:
public void genericForEachLoop(POITextExtractor te) { // 直接将所有ArrayList存入数组 final ArrayList<String>[] listArray = new ArrayList[]{ KEYWORDS, CUSTOMERS, SYSTEM_DEPS, MODULES, DRIVE_DEFS, PROCESS_IDS }; for(ArrayList<String> currentList : listArray) { for (String item : currentList) { if (te.getText().contains(item)) { System.out.println(item); } } } }
要是你还是需要打印每个集合的名称,可以给每个集合配个名称数组,和ArrayList数组一一对应,遍历的时候同时取索引就行。
为什么原来的代码不行?
你原来的al = tagArrays[i];这行代码,tagArrays[i]是字符串类型,而al是ArrayList<String>类型,Java作为静态类型语言,完全不允许这种跨类型的赋值,所以编译都通不过。虽然反射可以实现通过字符串名称引用变量,但反射写法复杂且容易出问题,这里用Map或者直接数组的方式显然更合适。
内容的提问来源于stack exchange,提问作者dsafas fsafasfsa
相关产品推荐
相关产品推荐

