两同结构对象列表按ID计数差异剔除List1多余对象方案咨询
实现方案
整体处理逻辑时间复杂度为O(n+m),即便列表规模到上千条也不会有性能问题,共分3步执行:
- 第一步:遍历List2,用哈希表(字典/HashMap)统计每个ID对应的对象数量,键为ID值,值为该ID在List2内的出现次数
- 第二步:遍历List1,用同样的规则统计每个ID对应的对象数量,存入另一张哈希表
- 第三步:遍历List1做元素过滤,对每个元素取自身ID,对比两张哈希表的计数值:仅当List1中该ID的计数小于等于List2中同ID的计数时,才保留当前元素,否则直接丢弃
边界情况处理:如果某个ID仅在List1中存在、List2中无对应ID,直接将List2侧的计数值按0计算即可,此时List1侧计数必然大于0,会自动触发全量移除规则,不需要额外编写分支判断。
代码示例
Java 实现
import java.util.*; import java.util.stream.Collectors; public class ListProcessor { // 业务对象结构,根据你的实际场景调整即可 static class BizEntity { private Integer id; private String name; public BizEntity(Integer id, String name) { this.id = id; this.name = name; } public Integer getId() { return id; } } public static List<BizEntity> filterValidEntities(List<BizEntity> list1, List<BizEntity> list2) { // 统计List2各ID出现次数 Map<Integer, Long> list2IdCount = list2.stream() .collect(Collectors.groupingBy(BizEntity::getId, Collectors.counting())); // 统计List1各ID出现次数 Map<Integer, Long> list1IdCount = list1.stream() .collect(Collectors.groupingBy(BizEntity::getId, Collectors.counting())); // 执行过滤 return list1.stream() .filter(entity -> list1IdCount.get(entity.getId()) <= list2IdCount.getOrDefault(entity.getId(), 0L)) .collect(Collectors.toList()); } // 验证示例逻辑 public static void main(String[] args) { List<BizEntity> list1 = Arrays.asList( new BizEntity(1, "James"), new BizEntity(1, "John"), new BizEntity(1, "Jane"), new BizEntity(2, "Carl") ); List<BizEntity> list2 = Arrays.asList( new BizEntity(1, "James"), new BizEntity(1, "John"), new BizEntity(2, "Carl") ); List<BizEntity> result = filterValidEntities(list1, list2); // 最终输出仅保留ID=2的Carl对象,符合预期 result.forEach(e -> System.out.println(e.getId() + ": " + e.getName())); } }
Python 实现
from collections import Counter def filter_list1(list1: list[dict], list2: list[dict]) -> list[dict]: # 统计两个列表的ID出现频次 count1 = Counter(item["id"] for item in list1) count2 = Counter(item["id"] for item in list2) # 过滤符合保留规则的元素 return [item for item in list1 if count1[item["id"]] <= count2.get(item["id"], 0)]
内容的提问来源于stack exchange,提问作者user1845777
相关产品推荐
相关产品推荐

