Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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/1/cocoa/3.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 为什么使用自定义比较器进行树集设置会破坏字符串对象的相等性?_Java_Comparator_Treeset - Fatal编程技术网

Java 为什么使用自定义比较器进行树集设置会破坏字符串对象的相等性?

Java 为什么使用自定义比较器进行树集设置会破坏字符串对象的相等性?,java,comparator,treeset,Java,Comparator,Treeset,我已经写了一个比较器,它计算给定字符串中的辅音来比较两个字符串,但它不知何故使TreeSet认为两个字符串相等(可能是当它们大小相同时) 还是不行 编辑=对于此问题,树集的数据结构不正确,应使用ArrayList。将您的SortByConsonants更改为以下内容。(请注意,类名应以大写字母开头) 类SortByConsonants实现了Comparator{ 公共整数比较(字符串a、字符串b){ 如果(计数(a)-计数(b)==0){ 返回1; } 返回计数(a)-计数(b); } 公共布尔

我已经写了一个比较器,它计算给定字符串中的辅音来比较两个字符串,但它不知何故使TreeSet认为两个字符串相等(可能是当它们大小相同时)

还是不行


编辑=对于此问题,树集的数据结构不正确,应使用ArrayList。

将您的
SortByConsonants
更改为以下内容。(请注意,类名应以大写字母开头)

类SortByConsonants实现了Comparator{
公共整数比较(字符串a、字符串b){
如果(计数(a)-计数(b)==0){
返回1;
}
返回计数(a)-计数(b);
}
公共布尔等于(字符串a、字符串b){
返回a等于(b);
}
公共整数计数(字符串行){
int辅音=0;
line=line.toLowerCase();
对于(int i=0;i

此外,由于我们只想根据辅音的计数进行排序,因此不需要计算元音、空格、数字等的数量。此外,也不需要将另一个参数类型传递给方法
count

当您编码时,您的竞争对手将返回
0
(意思是相等)
如果两个字符串的辅音数相同
您定义了:

TreeSet<String> tree = new TreeSet<String>(new sortByConsonants());
TreeSet tree=new TreeSet(new sortByConsonants());

因此,在
树中
不可能存在两个辅音数相同的项目(字符串)

这看起来是错误的
如果((ch>='a'&&ch-Well,当compare返回0时,字符串相等(在这个comperator的意义上)。好吧,你实际上修复了我的坏计数方法,Kudos。现在的问题是我需要根据辅音的数量对字符串对象进行排序。你能帮我吗?我也这么做了,它只返回11个元素(所有元素的大小不同)==>100 11===die army进入上诉世纪彩色指南首选项分发服务器。我明白了。为什么还要使用树集?您只需使用以下命令对列表进行排序:
list.sort(new sortByConsonants());
然后打印它
list.forEach(System.out::println);
我想在不使用排序方法的情况下对字符串进行排序;这就是我使用这种特殊逻辑的原因。我对答案进行了编辑。它们被省略的原因是,当辅音的数量相等时,我们什么都不做。而且也不需要计算元音、空格等的数量。好吧,我的逻辑似乎有缺陷。你能轻松帮助我实现目标(编辑问题)我知道你想要按照辅音的数量对项目进行排序。但是为什么要使用Treeset?这限制了你在其中存储的项目。我以为Tree会根据我在构造函数中提供的自定义比较器逻辑对字符串进行排序,但它的工作方式与它假设的工作方式不同。你能建议一些方法吗?arraylist可以使用一个自定义的comperator对项目进行排序,然后我需要调用arrayList的排序方法;要求是不要使用这个方法。
class sortByConsonants implements Comparator<String>{

    public int compare(String a, String b) 
    { 

        return count(a,2)-count(b,2);
    } 
    public boolean equals(String a,String b) {

        return a.equals(b);

    }

    public int count(String line,int type) {
        int vowels = 0, consonants = 0, digits = 0, spaces = 0;

        line = line.toLowerCase();
        for(int i = 0; i < line.length(); ++i)
        {
            char ch = line.charAt(i);
            if(ch == 'a' || ch == 'e' || ch == 'i'
                || ch == 'o' || ch == 'u') {
                ++vowels;
            }
            else if((ch >= 'a'&& ch <= 'z')) {
                ++consonants;
            }
            else if( ch >= '0' && ch <= '9')
            {
                ++digits;
            }
            else if (ch ==' ')
            {
                ++spaces;
            }
        }

        if(type==1) {
            return vowels;
        }else {
            return consonants;
        }

    }

}
public int compare(String a, String b) 
    { 
        if(count(a,2)-count(b,2)==0) {
            return 1;
        }
        return count(a,2)-count(b,2);
    } 
class SortByConsonants implements Comparator<String> {

    public int compare(String a, String b) {
        if (count(a) - count(b) == 0) {
            return 1;
        }
        return count(a) - count(b);
    }

    public boolean equals(String a, String b) {
        return a.equals(b);
    }

    public int count(String line) {
        int consonants = 0;
        line = line.toLowerCase();
        for (int i = 0; i < line.length(); ++i) {
            char ch = line.charAt(i);
            if (ch != 'a' && ch != 'e' && ch != 'i' && ch != 'o' && ch != 'u') {
                consonants++;
            }
        }
        return consonants;
    }

}
TreeSet<String> tree = new TreeSet<String>(new sortByConsonants());