Сравнение длинны и последовательность слов в списке
Как можно автоматизировать сравнение, чтобы не сравнивать каждый элемент вручную?
В список добавляются слова, в среднем от 2 до 10, но может и больше, системой не ограничено. Надо проверить, чтобы каждое следующее слово было на 1 букву длиннее, чем предыдущее, и вернуть число, равное этой последовательности.
Например, в данном случае правильная последовательность равна 3:
аа
ааа
аааа
ааааааа
Ответы (1 шт):
Для хранения коллекции значений в каком-либо порядке можно использовать 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]