我正在尝试使用优先级队列根据每个字符串中有多少个单词(空格)对字符串进行排序。我的代码仅在某些场景下有效,但当每个字符串的空格数量真正分散时则不起作用。我想是因为我的方法没有对它们进行全部比较。
Comparator<String> whiteSpaces = new Comparator<String>() {
int count1 = 0;
int count2 = 0;
char c = ' ';
@Override
public int compare(String s1, String s2) {
for(int i = 0; i < s1.length(); i++) {
if(s1.charAt(i) == c){
count1++;
}
}
for(int i = 0; i < s2.length(); i++) {
if(s2.charAt(i) == c) {
count2++;
}
}
return count1 - count2;
}
};
我可以修改我所拥有的内容,以便它与添加到优先级队列中的所有字符串进行比较吗?提前致谢。
最佳答案
由于您未在调用之间将 count1
和 count2
重置为 0
,比较器
无法工作到compare()
。
实际上,问题在于 count1
和 count2
是字段。它们应该是局部变量。
将 count1
和 count2
声明移至方法中。
Comparator<String> whiteSpaces = new Comparator<String>() {
char c = ' ';
@Override
public int compare(String s1, String s2) {
int count1 = 0;
int count2 = 0;
for(int i = 0; i < s1.length(); i++) {
if(s1.charAt(i) == c){
count1++;
}
}
for(int i = 0; i < s2.length(); i++) {
if(s2.charAt(i) == c) {
count2++;
}
}
return count1 - count2;
}
};
其他改进:
字段
c
应该是private
和final
,并且命名得更好。创建一个辅助方法来消除重复的代码。
使用
Integer.compare(a, b)
代替减法。
Comparator<String> whiteSpaces = new Comparator<String>() {
private final char separator = ' ';
@Override
public int compare(String s1, String s2) {
return Integer.compare(countSeparators(s1), countSeparators(s2));
}
private int countSeparators(String s) {
int count = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == separator) {
count++;
}
}
return count;
}
};
关于java - 使用带有自定义比较器的优先级队列根据字符串中的单词数进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61089048/