Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用我的比较器在TreeSet中排序并避免重复?_Java_Sorting_Duplicates_Comparator_Treeset - Fatal编程技术网

Java 如何使用我的比较器在TreeSet中排序并避免重复?

Java 如何使用我的比较器在TreeSet中排序并避免重复?,java,sorting,duplicates,comparator,treeset,Java,Sorting,Duplicates,Comparator,Treeset,我想创建TreeSet(),它将使用预定义的比较器对元素进行排序。但问题是,当我将比较器作为参数提供给树集(MyComparator)的构造函数时,树集并没有避免重复。我可以实现元素的排序并避免重复吗 比较器如下所示: publicstaticcomparatorbynameandage=(L,R)->{ //检查它们是否有相同的代码 if(L.code.equalsIgnoreCase(R.code)) 返回0; int res=L.name.compareToIgnoreCase(R.nam

我想创建
TreeSet()
,它将使用预定义的比较器对元素进行排序。但问题是,当我将比较器作为参数提供给
树集(MyComparator)
的构造函数时,树集并没有避免重复。我可以实现元素的排序并避免重复吗

比较器如下所示:

publicstaticcomparatorbynameandage=(L,R)->{
//检查它们是否有相同的代码
if(L.code.equalsIgnoreCase(R.code))
返回0;
int res=L.name.compareToIgnoreCase(R.name);
如果(res==0)
res=整数。比较(L.age,R.age);
返回res;
};

您误解了一些事情。TreeSet确实消除了重复项,“重复项”定义为“比较方法返回0的任意两个元素”。树集中不能同时存在两个这样的元素。如果你这么说,我肯定你的代码不起作用,但是你粘贴的代码不是问题,TreeSet的代码也不是问题

一个简单的例子:

Comparator<String> byLength = (a, b) -> a.length() - b.length();
Set<String> set = new TreeSet<String>(byLength);
set.add("Hello");
set.add("World");
set.add("X");
set.add("VeryLong");
System.out.println(set);

> [X, Hello, VeryLong]
比较器byLength=(a,b)->a.length()-b.length(); 集合=新树集合(长度); set.add(“Hello”); 设置。添加(“世界”); 设置。添加(“X”); 集合。添加(“VeryLong”); 系统输出打印项次(套); >[X,你好,维隆] 注意“World”是如何消失的,因为比较器说它等于Hello(它们都是5长度,a.length()-b.length()返回0,而0是“相等的,因此,根据treeset消除重复项”)。换句话说,粘贴的代码将消除重复项,问题在于其他地方。

此代码与您的代码几乎相同


比较器链
publicstaticvoidmain(字符串[]args){
//自定义比较器
比较器byNameAndAge=比较器
//第一个按名称排序忽略大小写
.comparing(参与者::getName,字符串::compareToIgnoreCase)
//按年龄进行第二次排序
.然后比较(参与者::getAge);
//以比较器作为参数的构造函数
树集树集=新树集(按名称和年龄);
treeSet.addAll(集合的(//测试数据
新参与者(“John”,25岁),
新参与者(“初级”,2),
新参与者(“詹姆斯”,31岁),
新参与者(约翰,22岁);
//输出
treeSet.forEach(System.out::println);
//姓名=詹姆斯,年龄=31岁
//姓名=约翰,年龄=22
//姓名=约翰,年龄=25岁
//姓名=初级,年龄=2
}
静态类参与者{
字符串名;
智力年龄;
公共参与者(字符串名称,整数){
this.name=名称;
这个。年龄=年龄;
}
公共字符串getName(){return name;}
public int getAge(){return age;}
@凌驾
公共字符串toString(){
返回“name=“+name+”,age=“+age;
}
}

此比较器不一致。如果排序中未考虑
代码
,则不能说具有相同
代码
的对象相等。问题是我希望根据名称和年龄进行排序,但避免基于代码的不同参数重复。假设有一个名为B、代码为“001”的对象放置在树集中。之后,我想存储名为A、代码为“002”的对象,该元素将放置在B的左侧。但现在我想放置名为G、代码为“002”的Ojbect,该元素将放置在右侧,因为不会存储其他元素,TreeSet不会检查A是否与G使用相同的代码。然后更新比较器方法,可能使用方便的
。然后在比较器上比较
方法,该方法允许链接两个比较器。当主比较器无法区分(例如,A/002和G/002具有相同的代码)时,然后并且只有第二个比较器启动,例如,按照字典顺序进行比较,从而确定A/002位于G/002之前。这对我很有效,谢谢你的建议和时间。