使用带有自定义比较器的优先级队列根据字符串中的单词数进行排序?

Using Priority Queue with Custom Comparator to Sort Based on Number of Words in a String?

我正在尝试使用优先队列根据每个字符串中有多少单词(空格)对字符串进行排序。我的代码仅适用于某些场景,但当每个字符串的空格数量真正分散时则无效。我认为是因为我的方法并没有将它们全部进行比较。

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 不工作,因为您没有在调用 compare().[=25 之间将 count1count2 重置为 0 =]

其实问题是count1count2是字段。它们应该是局部变量。

count1count2 声明移动到方法中。

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 应该是 privatefinal,并且更好地命名。

  • 创建一个帮助方法来消除重复代码。

  • 使用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;
    }
};