Java如何按位置迭代比较两个列表并生成符合规则的输出列表
Java按索引对比两个列表的实现方案
核心逻辑
- 逐个对比两个列表相同索引位置的元素
- 元素相等时结果对应位置填充空字符串,不等时取第二个列表的对应元素
- 提前做参数合法性校验,避免空指针、长度不一致导致的异常
实现代码
1. 通用for循环实现(兼容所有Java版本,适合随机访问列表如ArrayList)
import java.util.ArrayList; import java.util.List; import java.util.Objects; public class ListCompareDemo { public static void main(String[] args) { // 示例输入构造 List<String> list1 = List.of("a", "b", "c", "d", "1", "e", "1", "", "2"); List<String> list2 = List.of("a", "b", "f", "d", "1", "e", "1", "g", "2"); List<String> result = compareLists(list1, list2); System.out.println(result); // 输出符合要求:[, , f, , , , , g, ] } public static List<String> compareLists(List<String> list1, List<String> list2) { // 参数校验 if (list1 == null || list2 == null) { throw new IllegalArgumentException("输入列表不能为null"); } if (list1.size() != list2.size()) { // 若允许长度不一致可自行调整此处逻辑 throw new IllegalArgumentException("两个输入列表长度必须一致"); } List<String> result = new ArrayList<>(list1.size()); for (int i = 0; i < list1.size(); i++) { // 用Objects.equals避免空指针 if (Objects.equals(list1.get(i), list2.get(i))) { result.add(""); } else { result.add(list2.get(i)); } } return result; } }
2. Java 8+ Stream简洁实现
import java.util.List; import java.util.Objects; import java.util.stream.IntStream; public static List<String> compareListsWithStream(List<String> list1, List<String> list2) { if (list1 == null || list2 == null) { throw new IllegalArgumentException("输入列表不能为null"); } if (list1.size() != list2.size()) { throw new IllegalArgumentException("两个输入列表长度必须一致"); } return IntStream.range(0, list1.size()) .mapToObj(i -> Objects.equals(list1.get(i), list2.get(i)) ? "" : list2.get(i)) .toList(); }
3. 迭代器实现(适合非随机访问列表如LinkedList,性能更优)
import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Objects; public static List<String> compareListsWithIterator(List<String> list1, List<String> list2) { if (list1 == null || list2 == null) { throw new IllegalArgumentException("输入列表不能为null"); } if (list1.size() != list2.size()) { throw new IllegalArgumentException("两个输入列表长度必须一致"); } Iterator<String> it1 = list1.iterator(); Iterator<String> it2 = list2.iterator(); List<String> result = new ArrayList<>(list1.size()); while (it1.hasNext() && it2.hasNext()) { String e1 = it1.next(); String e2 = it2.next(); result.add(Objects.equals(e1, e2) ? "" : e2); } return result; }
4. 泛型通用版本(支持任意类型的列表对比)
import java.util.ArrayList; import java.util.List; import java.util.Objects; public static <T> List<T> compareGenericLists(List<T> list1, List<T> list2, T emptyValue) { if (list1 == null || list2 == null || emptyValue == null) { throw new IllegalArgumentException("入参不能为null"); } if (list1.size() != list2.size()) { throw new IllegalArgumentException("两个输入列表长度必须一致"); } List<T> result = new ArrayList<>(list1.size()); for (int i = 0; i < list1.size(); i++) { result.add(Objects.equals(list1.get(i), list2.get(i)) ? emptyValue : list2.get(i)); } return result; }
注意事项
- 使用
Objects.equals()做元素对比,可避免元素为null时抛出空指针异常 - 若允许两个输入列表长度不一致,可自行调整逻辑:比如超出短列表长度的位置统一取长列表的元素,或填充空字符串即可
内容的提问来源于stack exchange,提问作者Gold Miss
相关产品推荐
相关产品推荐

