Сортировка массива в лексикографическом порядке по убыванию длины
JAVA
Здравствуйте) В чем заключается моя проблема: у меня есть содержимое текстового файла и мне нужно отсортировать его содержимое в лексикографическом порядке по убыванию длины.
Пример: армагедон алфавит ахаха ад а ; бабочка бензин бак б
Знаю, что существует sort, но он сортирует только в лексикографическом порядке. Может каким-то образом использовать Comparable? Пока его применение мне не особо понятно. Подскажите пожалуйста!
p.s. содержимое файла хранится в листе, без лишних знаков, только слова.
Ответы (2 шт):
@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, про которое Вы очевидно не знали, а так, ход мыслей был правильный ;)
Я тут написала метод сортировки со своими знаниями 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));
}
}
}