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]]
跨语言通用实现逻辑
所有编程语言都可以按照相同逻辑实现该需求:
- 定义固定的子列表标准化规则:按统一顺序排序后转为可哈希的结构化类型
- 用哈希集合存储已出现的标准化key
- 遍历原始集合,仅保留key第一次出现的子列表即可
内容的提问来源于stack exchange,提问作者T.Med
相关产品推荐
相关产品推荐

