Java 带有自定义比较器的TreeSet无法生成正确的结果
我无法找出可能的错误。这可能是一个愚蠢的问题 问题:给定一个Java 带有自定义比较器的TreeSet无法生成正确的结果,java,duplicates,comparator,treeset,Java,Duplicates,Comparator,Treeset,我无法找出可能的错误。这可能是一个愚蠢的问题 问题:给定一个字符串的数组,删除重复项并给出按字符串长度排序的树集 以下是我的实现: public class MyPrograms { public static void main(String[] args){ String[] arr = {"hello","world","a","b","cv","def","456","hello","world","b"}; System.out.println(Arr
字符串的数组,删除重复项并给出按字符串长度排序的树集
以下是我的实现:
public class MyPrograms {
public static void main(String[] args){
String[] arr = {"hello","world","a","b","cv","def","456","hello","world","b"};
System.out.println(Arrays.toString(arr));
sortStringbyLen(arr);
}
public static void sortStringbyLen(String[] arr){
Set<String> set = new TreeSet<String>(new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
return Integer.compare(o2.length(), o1.length());
}
});
set.addAll(Arrays.asList(arr));
System.out.println(set);
}
}
}
虽然我得到了正确的排序顺序,但我看到最终集合中缺少许多不重复的元素(例如,b,456
)TreeMap
认为与0相比的所有元素都相等(这实际上打破了Map
接口的约定)。因此,使用比较器的任何相同长度的字符串
都将返回0并被删除。您需要添加一个条件,即如果字符串长度相同,则应调用字符串的compareTo
方法。TreeMap
认为所有与0比较的元素都相等(这实际上打破了Map
接口的约定)。因此,使用比较器的任何相同长度的字符串
都将返回0并被删除。您需要添加一个条件,即如果字符串长度相同,则应调用字符串的compareTo
方法。TreeMap
认为所有与0比较的元素都相等(这实际上打破了Map
接口的约定)。因此,使用比较器的任何相同长度的字符串
都将返回0并被删除。您需要添加一个条件,即如果字符串长度相同,则应调用字符串的compareTo
方法。TreeMap
认为所有与0比较的元素都相等(这实际上打破了Map
接口的约定)。因此,使用比较器的任何相同长度的字符串
都将返回0并被删除。您需要添加一个条件,即如果字符串长度相同,则应调用字符串的compareTo
方法。要获得正确的行为,需要比较器输出与equals
方法一致。这里,当两个字符串的长度相同时,比较器的输出为0,因此每个不同长度只保留一个元素。要解决此问题,您应该在比较器中断开连接,可能如下所示:
new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
int cmp = Integer.compare(o2.length(), o1.length());
return cmp != 0 ? cmp : o1.compareTo(o2);
}
}
新比较器(){
@凌驾
公共整数比较(字符串o1、字符串o2){
int cmp=Integer.compare(o2.length(),o1.length());
返回cmp!=0?cmp:o1。与(o2)相比;
}
}
要获得正确的行为,需要比较器输出与equals
方法一致。这里,当两个字符串的长度相同时,比较器的输出为0,因此每个不同长度只保留一个元素。要解决此问题,您应该在比较器中断开连接,可能如下所示:
new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
int cmp = Integer.compare(o2.length(), o1.length());
return cmp != 0 ? cmp : o1.compareTo(o2);
}
}
新比较器(){
@凌驾
公共整数比较(字符串o1、字符串o2){
int cmp=Integer.compare(o2.length(),o1.length());
返回cmp!=0?cmp:o1。与(o2)相比;
}
}
要获得正确的行为,需要比较器输出与equals
方法一致。这里,当两个字符串的长度相同时,比较器的输出为0,因此每个不同长度只保留一个元素。要解决此问题,您应该在比较器中断开连接,可能如下所示:
new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
int cmp = Integer.compare(o2.length(), o1.length());
return cmp != 0 ? cmp : o1.compareTo(o2);
}
}
新比较器(){
@凌驾
公共整数比较(字符串o1、字符串o2){
int cmp=Integer.compare(o2.length(),o1.length());
返回cmp!=0?cmp:o1。与(o2)相比;
}
}
要获得正确的行为,需要比较器输出与equals
方法一致。这里,当两个字符串的长度相同时,比较器的输出为0,因此每个不同长度只保留一个元素。要解决此问题,您应该在比较器中断开连接,可能如下所示:
new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
int cmp = Integer.compare(o2.length(), o1.length());
return cmp != 0 ? cmp : o1.compareTo(o2);
}
}
新比较器(){
@凌驾
公共整数比较(字符串o1、字符串o2){
int cmp=Integer.compare(o2.length(),o1.length());
返回cmp!=0?cmp:o1。与(o2)相比;
}
}
应该如何比较相同长度的字符串?@rgetman:谢谢,这一点都没有。@Rod\u Algonquin:示例输出就在本章末尾的正下方question@eagertoLearn对不起,我是说预期的结果相同长度的字符串应该如何比较?@targetman:谢谢,这一点都没有。@Rod_Algonquin:示例输出就在本章末尾的正下方question@eagertoLearn对不起,我是说预期的结果相同长度的字符串应该如何比较?@targetman:谢谢,这一点都没有。@Rod_Algonquin:示例输出就在本章末尾的正下方question@eagertoLearn对不起,我是说预期的结果相同长度的字符串应该如何比较?@targetman:谢谢,这一点都没有。@Rod_Algonquin:示例输出就在本章末尾的正下方question@eagertoLearn对不起,我是说预期的结果