Java 8 вот-вот выйдет... Узнав о потоках, я понял сценарий группировки анаграмм, используя один из новых способов. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу найти способ группировать объекты Strings, используя функции map/reduce. Вместо этого мне пришлось создать аналогичный способ, описанный в http://docs.oracle.com/javase/tutorial/collections/streams/reduction.html.
На основе документации мы можем просто использовать LIST.stream(). collect (Collectors.groupingBy(POJO:: GET_METHOD)), чтобы Collectors.groupingBy() собирал ключи карты на основе используемого метода, Однако этот подход слишком громоздкий, чтобы обернуть простое представление String.
public class AnagramsGrouping {
static class Word {
public String original;
public Word(String word) {
original = word;
}
public String getKey() {
char[] characters = input.toCharArray();
Arrays.sort(characters);
return new String(characters);
}
public String toString() {
return original;
};
}
public static void main(String[] args) {
List<Word> words = Arrays.asList(new Word("pool"), new Word("loop"),
new Word("stream"), new Word("arc"), new Word("odor"),
new Word("car"), new Word("rood"), new Word("meats"),
new Word("fires"), new Word("fries"), new Word("night"),
new Word("thing"), new Word("mates"), new Word("teams"));
Map<String, List<Word>> anagrams = words.stream().collect(
Collectors.groupingBy(Word::getKey));
System.out.println(anagrams);
// This prints the following:
{door=[odor, rood], acr=[arc, car], ghint=[night, thing],
aemrst=[stream], efirs=[fires, fries], loop=[pool, loop],
aemst=[meats, mates, teams]}
Вместо этого я ищу более простое и более прямое решение, которое использует новые функции map/reduce для накопления результатов в подобной интерфейсной карте. На основе qaru.site/info/46526/... у меня есть следующее:
List<String> words2 = Arrays.asList("pool", "loop", "stream", "arc",
"odor", "car", "rood", "meats", "fires", "fries",
"night", "thing", "mates", "teams");
words2.stream().collect(Collectors.toMap(w -> sortChars(w), w -> w));
Но этот код генерирует ключевое столкновение, так как это карта 1-1. "Исключение в потоке" main "java.lang.IllegalStateException: Дублировать пул ключей", что имеет смысл... Есть ли способ сгруппировать их в аналогичный вывод, как первое решение с groupingBy, но без использования POJO-упаковки значений