Использование очереди приоритетов с пользовательским компаратором для сортировки по количеству слов в строке? - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь использовать приоритетную очередь для сортировки строк по количеству слов (пробелов) в каждой строке. Мой код работает только в определенном сценарии ios, но не тогда, когда количество пробелов в строке действительно распределено. Я думаю, потому что мои методы не сравнивают их все.

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

Могу ли я изменить то, что у меня есть, чтобы оно сравнивалось со всеми строками, добавленными в очередь priority? Заранее спасибо.

1 Ответ

1 голос
/ 08 апреля 2020

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 и 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;
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...