Java 8即将发布...在学习Streams时,我遇到了一个关于使用其中一种新方法对变位词进行分组的场景。我遇到的问题是我找不到使用map/reduce函数来分组字符串对象的方式。相反,我不得不创建一个与聚合操作-规约文档中所述类似的方式。
根据文档,我们可以简单地使用:
LIST<T>.stream().collect(Collectors.groupingBy(POJO::GET_METHOD))
这样,Collectors.groupingBy()
方法将根据使用的方法聚合地图的键。然而,这种方法似乎过于繁琐,无法简单地包装成一个字符串表示。
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);
}
}
这将打印以下内容:
{door=[odor, rood], acr=[arc, car], ghint=[night, thing],
aemrst=[stream], efirs=[fires, fries], loop=[pool, loop],
aemst=[meats, mates, teams]}
相反,我正在寻找一个更简单、更直接的解决方案,使用新的map/reduce函数将结果累积到类似接口 Map<String,List<String>
中。根据如何将List转换为Map,我有以下内容:
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的Map。
Exception in thread "main" java.lang.IllegalStateException: Duplicate key pool
这是有道理的...是否有一种方法可以将它们分组成与第一个解决方案类似的输出,但不使用POJO包装值?