Сравнение длинны и последовательность слов в списке

Как можно автоматизировать сравнение, чтобы не сравнивать каждый элемент вручную?

В список добавляются слова, в среднем от 2 до 10, но может и больше, системой не ограничено. Надо проверить, чтобы каждое следующее слово было на 1 букву длиннее, чем предыдущее, и вернуть число, равное этой последовательности.

Например, в данном случае правильная последовательность равна 3:

аа
ааа
аааа
ааааааа

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

Автор решения: Podushkoved

Для хранения коллекции значений в каком-либо порядке можно использовать TreeSet, при инициализации указав ему компаратор - по каким полям сравнивать. Например, в алфавитном порядке natural order:

TreeSet<String> strings = new TreeSet<>((o1, o2) -> o1.compareTo(o2));

или

TreeSet<String> strings = new TreeSet<>(String::compareTo);

В данном случае, если нужен порядок по длине слов:

TreeSet<String> strings = new TreeSet<>(Comparator.comparingInt(String::length));
strings.add("a");
strings.add("aaaa");
strings.add("aaa");
strings.add("aa");
strings.add("aaaaa");

System.out.println(strings); // [a, aa, aaa, aaaa, aaaaa]

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

TreeSet<String> strings = new TreeSet<>(
        Comparator.comparingInt(String::length).thenComparing(String::compareTo));
strings.add("a");
strings.add("bb");
strings.add("ab");
strings.add("aaaa");
strings.add("aaa");
strings.add("aa");
strings.add("aaaaa");

System.out.println(strings); // [a, aa, ab, bb, aaa, aaaa, aaaaa]

Дополнительно из интерфейса NavigableSet реализована возможность поиска по получившемуся дереву значений:

System.out.println(strings);
System.out.println(strings.headSet("aa", true));
System.out.println(strings.subSet("aa", true, "aaa", true));
System.out.println(strings.tailSet("aaa", true));

Вывод:

[a, aa, aaa, aaaa, aaaaa]
[a, aa]
[aa, aaa]
[aaa, aaaa, aaaaa]
→ Ссылка