如何检查含自定义对象的列表是否存在重复项(基于构造方法字符串参数)
嘿,这个需求我之前做业务逻辑的时候也碰到过,给你分享几个实用的解决方案,都是基于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
相关产品推荐
相关产品推荐

