首页 > 解决方案 > 当元素是整数列表时,Java Sets 可以在不考虑顺序的情况下测试重复元素吗?

问题描述

我正在使用 aSet<List<Integer>>并认为它能够识别重复列表,而无需考虑顺序(在 中List<Integer>),但显然它将具有相同元素和不同顺序的列表视为唯一元素。

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.HashSet;

public class Test {

    public static void main(String[] args) {
        
        
        Set<List<Integer>> set = new HashSet();
        
        List<Integer> l1 = new ArrayList();
        List<Integer> l2 = new ArrayList();
        List<Integer> l3 = new ArrayList();
        
        l1.add(1);
        l1.add(2);
        set.add(l1);
        
        System.out.println(set);
        
        l2.add(1);
        l2.add(2);
        set.add(l2);
        
        System.out.println(set);
        
        l3.add(2);
        l3.add(1);
        set.add(l3);
        
        System.out.println(set);
        

    }
    


}

添加具有相同元素和顺序的列表时,输出显示没有变化,但是当顺序颠倒时,它被认为是唯一的:

[[1,2]]
[[1,2]]
[[1,2], [2,1]]

是否有某种方法可以测试重复项,无论顺序如何?最初,我正在使用整数列表列表List<List<Integer>>,所以如果在其中有某种方法可以做到这一点,那就更好了。

标签: javaset

解决方案


具有相同元素和不同顺序的列表

那是因为

如果两个列表以相同的顺序包含相同的元素,则它们被定义为相等。此定义确保 equals 方法在List接口的不同实现中正常工作。

如果您想要基于内容而不是 order的平等,那么您正在寻找除了列表平等之外的东西。也许您可以使用Set. 否则,您需要编写一个自定义比较器(这将变得非常昂贵;您可以轻松进入 O(n^3 log n) 领域)或一个自定义包装器,该包装器保留一对列表,原始列表和排序列表复制比较。


推荐阅读