Я бы не занимался подсчетом различных значений, поскольку это не то, что вас интересует. Вы хотите знать, равны ли все элементы в соответствии со специальным правилом равенства.
Поэтому, когда мы создаем метод для преобразования String
в канонический ключ (т.е. все отсортированные символы)
private CharBuffer canonical(String s) {
char[] array = s.toCharArray();
Arrays.sort(array);
return CharBuffer.wrap(array);
}
мы можем просто проверить, все ли последующие элементы равны первому:
boolean isAnagram(String[] list) {
if(list.length == 0) return false;
return Arrays.stream(list, 1, list.length)
.map(this::canonical)
.allMatch(canonical(list[0])::equals);
}
Обратите внимание, что для ссылок на методы вида expression::name
выражение оценивается один раз, а результат захватывается, поэтому canonical(list[0])
оценивается только один раз для всей операции потока и только equals
вызывается для каждого элемента.
Конечно, вы также можете использовать Stream API для создания канонических ключей:
private IntBuffer canonical(String s) {
return IntBuffer.wrap(s.chars().sorted().toArray());
}
(метод isAnagram
не требует изменений)
Обратите внимание, что CharBuffer
и IntBuffer
могут использоваться в качестве облегченных оболочек для массивов, как в этом ответе, и реализовывать equals
и hashCode
соответственно, исходя из фактического содержимого массива.