Сортировка массива в лексикографическом порядке по убыванию длины

JAVA

Здравствуйте) В чем заключается моя проблема: у меня есть содержимое текстового файла и мне нужно отсортировать его содержимое в лексикографическом порядке по убыванию длины.

Пример: армагедон алфавит ахаха ад а ; бабочка бензин бак б

Знаю, что существует sort, но он сортирует только в лексикографическом порядке. Может каким-то образом использовать Comparable? Пока его применение мне не особо понятно. Подскажите пожалуйста!

p.s. содержимое файла хранится в листе, без лишних знаков, только слова.


Ответы (2 шт):

Автор решения: Ramiz
@Test
void test() {
    String[] array = {"a", "abba", "b", "baba", "abracadabra"};

    Arrays.sort(array, 
          Comparator.comparing(String::length) // first compare by element length
            .reversed()   // in descending order 
            .thenComparing(Function.identity())); // then comparing by natural, i.e. lexicographically
    
    String[] expected = {"abracadabra", "abba", "baba", "a", "b"};

    assertArrayEquals(expected, array);
}

ключевое слово - thenComparing, про которое Вы очевидно не знали, а так, ход мыслей был правильный ;)

→ Ссылка
Автор решения: Aлиса

Я тут написала метод сортировки со своими знаниями java на данный момент, может кому пригодится)

public void fromLargeToSmall () { //список уник.слов в лексикогр.порядке по убыванию длины 
    String[] chars = new String[]{"а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы", "ь", "э", "ю", "я"};
    TreeMap <String, ArrayList<String>> array = new TreeMap<>();

    for (String sym : chars) {
        array.put(sym, new ArrayList());
    }

    for (String symbol : chars) {
        for (String word : listFirst) {
            if (Character.toString(word.charAt(0)).equals(symbol))
                array.get(symbol).add(word);
        }

        for (int i = 0; i < array.get(symbol).size(); i++) {
            for (int j = array.get(symbol).size() - 1; j > i; j--) {
                if (array.get(symbol).get(j - 1).length() < array.get(symbol).get(j).length()) {
                    String temp = array.get(symbol).get(j - 1);
                    array.get(symbol).set(j - 1, array.get(symbol).get(j));
                    array.get(symbol).set(j, temp);
                } } } }

    System.out.println("\n\n-----LIST OF UNIQUE WORDS-----");
    for (String symbol : chars) {
        System.out.println("\n             " + symbol.toUpperCase() + "             ");
         for (int i = 0; i< array.get(symbol).size(); i++) {
             System.out.println(array.get(symbol).get(i));
         }
    }
}    
→ Ссылка