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

Java中如何对存储列表的Set去重(不考虑列表内元素顺序且保留元素)

列表集合按元素组成(忽略顺序)去重方案

原有方案失效原因

  • Set<Set> 失效:Set结构本身不允许存储重复元素,会直接抹除子列表内的重复值,丢失元素频次信息,比如[-1,-1,2]会被处理为{-1,2}
  • Set<List> 失效:List的相等性判断要求元素顺序完全一致,顺序不同但元素组成相同的列表会被判定为不同值,无法完成去重

核心解决思路

要同时满足「忽略元素顺序」和「保留重复元素频次」两个要求,对每个子列表做标准化处理后再做去重判断即可:

  • 对每个子列表内部元素按照固定规则(升序/降序)排序,只要两个子列表的元素组成和重复频次完全一致,排序后的结果就完全相同
  • 把排序后的结果转换成可哈希的类型(比如Python中的元组、Java中的可序列化数组),即可存入Set完成去重
  • 最后可以根据需求选择保留首次出现的原始子列表,或者统一使用排序后的标准化子列表

代码实现示例(Python)

# 原始输入
original_list = [[-1,-1,2],[0,-1,1],[1,-1,0],[2,-1,-1],[-1,2,-1],[-1,1,0],[0,1,-1],[-1,0,1],[1,0,-1]]

unique_keys = set()
result = []
for item in original_list:
    # 生成标准化去重key
    sorted_key = tuple(sorted(item))
    if sorted_key not in unique_keys:
        unique_keys.add(sorted_key)
        # 如需输出排序后的标准化三元组,替换为 result.append(list(sorted_key))
        result.append(item)

print(result)

输出结果

  • 保留首次出现的原始子列表输出:[[-1, -1, 2], [0, -1, 1]]
  • 输出标准化排序后的子列表:[[-1, -1, 2], [-1, 0, 1]]

跨语言通用实现逻辑

所有编程语言都可以按照相同逻辑实现该需求:

  1. 定义固定的子列表标准化规则:按统一顺序排序后转为可哈希的结构化类型
  2. 用哈希集合存储已出现的标准化key
  3. 遍历原始集合,仅保留key第一次出现的子列表即可

内容的提问来源于stack exchange,提问作者T.Med

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:57:01