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

如何检查含自定义对象的列表是否存在重复项(基于构造方法字符串参数)

嘿,这个需求我之前做业务逻辑的时候也碰到过,给你分享几个实用的解决方案,都是基于Java常用API实现的,先提前说明:我们默认你的MyCustomObject类有一个getter方法来获取构造方法里的第二个字符串参数(比如叫getValue()),先把这个类的基础结构补一下方便理解:

class MyCustomObject {
    private int id;
    private String value;

    public MyCustomObject(int id, String value) {
        this.id = id;
        this.value = value;
    }

    // 获取构造方法中第二个字符串参数的getter
    public String getValue() {
        return value;
    }
}
方案1:用Java 8+ Stream API(简洁直观)

如果你用的是Java 8及以上版本,Stream API可以用简洁的代码搞定,有两种写法:

写法A:统计每个字符串的出现频次

List<MyCustomObject> list = Arrays.asList(
    new MyCustomObject(1, "one"),
    new MyCustomObject(2, "two"),
    new MyCustomObject(3, "one") // 这里是重复项
);

boolean hasDuplicates = list.stream()
    // 按字符串参数分组,统计每个组的元素数量
    .collect(Collectors.groupingBy(MyCustomObject::getValue, Collectors.counting()))
    .values()
    // 只要有一个组的数量大于1,就说明存在重复
    .stream()
    .anyMatch(count -> count > 1);

System.out.println(hasDuplicates); // 输出true

写法B:对比去重前后的数量

这种更简洁,原理是提取所有字符串参数后去重,看去重后的数量和原列表数量是否一致:

boolean hasDuplicates = list.stream()
    .map(MyCustomObject::getValue)
    .distinct()
    .count() != list.size();
方案2:用HashSet实现提前终止(高效)

如果你的列表很大,这个方法会更高效——因为它找到第一个重复项就会立刻停止遍历,不用处理完所有元素:

Set<String> seenValues = new HashSet<>();
boolean hasDuplicates = false;

for (MyCustomObject obj : list) {
    String value = obj.getValue();
    // HashSet的add方法如果元素已存在会返回false
    if (!seenValues.add(value)) {
        hasDuplicates = true;
        break; // 找到重复就跳出循环,节省性能
    }
}

System.out.println(hasDuplicates); // 输出true
方案3:传统嵌套循环(适合理解基础逻辑)

这个方法效率最低(时间复杂度O(n²)),但适合新手理解重复检查的核心逻辑:

boolean hasDuplicates = false;

for (int i = 0; i < list.size(); i++) {
    String currentValue = list.get(i).getValue();
    // 只和后面的元素对比,避免重复检查
    for (int j = i + 1; j < list.size(); j++) {
        if (currentValue.equals(list.get(j).getValue())) {
            hasDuplicates = true;
            break;
        }
    }
    if (hasDuplicates) break;
}

注意点

如果你的字符串参数可能为null,记得加null判断,比如在Stream里过滤null:

boolean hasDuplicates = list.stream()
    .map(MyCustomObject::getValue)
    .filter(Objects::nonNull) // 先过滤掉null值
    .distinct()
    .count() != list.stream().filter(obj -> obj.getValue() != null).count();

或者在循环里判断:

if (value != null && !seenValues.add(value)) {
    // 处理重复逻辑
}

内容的提问来源于stack exchange,提问作者Joao Souza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:07:33