You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 21:15:01