Сложная сортировка ArrayList с использованием Collections.sort ()? - PullRequest
0 голосов
/ 01 декабря 2018

В моем классе Driver есть ArrayList<Word>, который нужно отсортировать.Мой класс Word имеет два атрибута:

public class Word {
    String word;
    int count;
}

В моем классе Driver он читает и добавляет каждый word файла .txt в ArrayList.Мне нужно сначала отсортировать этот ArrayList по количеству, а для слов, имеющих одинаковые count, мне нужно отсортировать их по алфавиту .Я мог бы сделать собственный класс Comparator для сортировки по количеству:

public class SortByFreq implements Comparator<Word>{
    @Override
    public int compare(Word w1, Word w2) {
        return -(w1.count - w2.count); // Sort as descending order
    } 
}

И это работает.Но теперь я застрял в том, как сохранить этот отсортированный ArrayList как таковой и выполнить еще одну сортировку ... потому что обычно использование Collections.sort () влияет на весь ArrayList и переопределение, не затрагивая их часть.Буду признателен за любую помощь!

Редактировать

Я сортирую свой ArrayList как таковой в моем классе Driver:

Collections.sort(wordList, new SortByFreq()); 

1 Ответ

0 голосов
/ 01 декабря 2018

Просто для улучшения логики компаратора в вашем коде

public class SortByFreq implements Comparator<Word> {
    @Override
    public int compare(Word w1, Word w2) {
        return Integer.compare(w2.getCount(), w1.getCount());
    }
}

Ваш общий компаратор должен выглядеть примерно так:

Comparator<Word> comparator = Comparator.comparingInt(Word::getCount).reversed()
                                        .thenComparing(Word::getWord);

, используя который вы можете отсортировать List<Word> wordlistas:

wordList.sort(comparator);

Если предполагается, что вы используете только пользовательский компаратор, то вы можете обновить компартмент, добавив ту же логику подсчета, что и

static class SortByFreqAndAlphabetically implements Comparator<Word> {
    @Override
    public int compare(Word w1, Word w2) {
        if (w1.getCount() != w2.getCount()) {
            return Integer.compare(w2.getCount(), w1.getCount());
        } else {
            return w1.getWord().compareTo(w2.getWord());
        }
    }
}

, а затемдалее используйте это для сортировки:

wordList.sort(new SortByFreqAndAlphabetically()); // similar to 'Collections.sort(wordList, new SortByFreqAndAlphabetically())' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...