首页 > 解决方案 > 使用带有自定义比较器的优先级队列根据字符串中的字数进行排序?

问题描述

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

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;
        }
    };

我可以修改我拥有的内容,以便与添加到优先级队列中的所有字符串进行比较吗?提前致谢。

标签: javastringsortingpriority-queueword

解决方案


Comparator不起作用,因为您count1没有count20调用compare().

实际上,问题在于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应该是privateand 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;
    }
};

推荐阅读