如何比较两个长度不同的ArrayList或Iterator元素并识别匹配项?
解决两个长度不同ArrayList的元素匹配问题
嘿,我来帮你搞定这个列表比较的问题!你的核心需求是检查用户输入的每个元素是否存在于源列表中,而不是按位置一一对比,之前用迭代器的思路走偏了,咱们一步步理清楚:
先说说你之前代码的问题
你之前同时遍历两个迭代器的逻辑,只适用于两个列表长度相同且需要按索引位置对比的场景,但你的需求是「检查存在性」,这种方式会导致两个严重问题:
- 多次调用
next():在if和else if里分别调用next(),会让迭代器指针跳过多个元素,比如第一个用户元素还没完成全源列表检查,就直接跳到下一个元素了; - 源列表迭代器提前耗尽:如果用户列表比源列表短,源迭代器还没遍历完就停止了,反过来如果用户列表更长,源迭代器会先走到头,抛出
NoSuchElementException。
方案1:最简单直接的方式——用contains()方法
既然只需要检查元素是否存在,完全不用自己写迭代器,ArrayList自带的contains()方法就能帮你完成遍历检查,代码简洁到爆炸:
// 初始化源列表和用户输入列表 List<String> list_SrcColumnDetails = new ArrayList<>(List.of("Id", "Name", "Address", "Age", "Email", "Phone", "City", "Country", "Zip", "Gender")); List<String> list_userEnteredfieldName = new ArrayList<>(List.of("Id", "Text")); // 遍历每个用户输入的元素,检查是否在源列表中 for (String userField : list_userEnteredfieldName) { if (list_SrcColumnDetails.contains(userField)) { System.out.println("User Entered field " + userField + " exists in Source"); } else { System.out.println("User Entered field " + userField + " is not correct"); } }
运行结果会是:
User Entered field Id exists in Source User Entered field Text is not correct
方案2:如果一定要用Iterator(比如练习需求)
如果你坚持要用迭代器实现,正确的思路是:对每个用户输入的元素,单独遍历整个源列表检查是否存在,而不是同时移动两个迭代器。代码示例:
List<String> list_SrcColumnDetails = new ArrayList<>(List.of("Id", "Name", "Address", ...)); List<String> list_userEnteredfieldName = new ArrayList<>(List.of("Id", "Text")); Iterator<String> userIterator = list_userEnteredfieldName.iterator(); while (userIterator.hasNext()) { String currentUserField = userIterator.next(); boolean isFound = false; // 对每个用户元素,重新获取源列表的迭代器进行全量检查 Iterator<String> srcIterator = list_SrcColumnDetails.iterator(); while (srcIterator.hasNext()) { if (currentUserField.equals(srcIterator.next())) { isFound = true; break; // 找到就停止遍历源列表 } } // 根据结果输出 if (isFound) { System.out.println("User Entered field " + currentUserField + " exists in Source"); } else { System.out.println("User Entered field " + currentUserField + " is not correct"); } }
方案3:大数据量下的性能优化——转成HashSet
如果你的源列表元素非常多(比如上千个),ArrayList的contains()是O(n)时间复杂度,转成HashSet后contains()是O(1),性能会提升很多:
// 把源列表转成HashSet Set<String> srcColumnSet = new HashSet<>(list_SrcColumnDetails); for (String userField : list_userEnteredfieldName) { if (srcColumnSet.contains(userField)) { System.out.println("User Entered field " + userField + " exists in Source"); } else { System.out.println("User Entered field " + userField + " is not correct"); } }
内容的提问来源于stack exchange,提问作者Vikas J
相关产品推荐
相关产品推荐

