java - 使用带有自定义比较器的优先级队列根据字符串中的字数进行排序?
问题描述
我正在尝试使用优先队列根据每个字符串中有多少个单词(空格)对字符串进行排序。我的代码仅在某些场景中有效,但在每个字符串的空格数量真正分散时无效。我想是因为我的方法并没有比较它们。
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;
}
};
我可以修改我拥有的内容,以便与添加到优先级队列中的所有字符串进行比较吗?提前致谢。
解决方案
Comparator
不起作用,因为您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
andfinal
,并且更好地命名。创建一个辅助方法来消除重复代码。
使用
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;
}
};
推荐阅读
- javascript - 在渲染链接到 Navlink 的组件之前隐藏当前组件 - React Router
- c++ - 为单元测试 C++ 实现 ToString 特化的问题
- xamarin - Xamarin.Forms iOS Xamarin.Build.Download 对象引用未设置为对象的实例
- java - 无法使用 jacoco 插件为使用 jmockit 库编写的测试用例生成覆盖率报告
- r - 预测 GARCH 模型显示不正确的日期
- c++ - 完成后对链表的操作给出错误
- sql - SQL 包含存储过程中的问题
- java - Spring Boot JPA CrudRepository 如何制作可选的搜索参数
- assembly - 如何在不同的行上打印输出并在 MASM 中显示计数
- php - 运行“撰写要求”后,有什么方法可以显示“下一步”方向吗?