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

两同结构对象列表按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:48:27