java - 当元素是整数列表时,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>>
,所以如果在其中有某种方法可以做到这一点,那就更好了。
解决方案
具有相同元素和不同顺序的列表
如果两个列表以相同的顺序包含相同的元素,则它们被定义为相等。此定义确保 equals 方法在
List
接口的不同实现中正常工作。
如果您想要基于内容而不是 order的平等,那么您正在寻找除了列表平等之外的东西。也许您可以使用Set
. 否则,您需要编写一个自定义比较器(这将变得非常昂贵;您可以轻松进入 O(n^3 log n) 领域)或一个自定义包装器,该包装器保留一对列表,原始列表和排序列表复制比较。
推荐阅读
- php - 如何创建管理员而不在数据库中创建管理表并且在同一页面中使用一个登录路由和控制器?
- python - 如何将数据框中的多个列表列转换为给定的列?
- php - 如何在 PayPal 结账时处理经常性费用
- javascript - 如何将字符串数组转换为打字稿类型?
- r - R中的正则表达式语法
- postgresql - 为触发器创建复制过程
- python - 如何在以下代码中一个接一个地突出显示单选按钮
- python - 在 SQLAlchemy 中,不能在模型类中创建虚拟列吗?
- ruby-on-rails - 为只能通过该链接访问的链接创建唯一令牌?
- java - 在 Java 中实现满足以下要求的 Singleton 的最佳方法是什么?