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