Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/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_Duplicates_Comparator_Treeset - Fatal编程技术网

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对不起,我是说预期的结果