题目:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
解法:
String[] strs = {"eat", "tea", "tan", "ate", "nat", "bat"};
public void test() {
System.out.println(new ArrayList<>(Arrays.stream(strs)
.collect(Collectors.groupingBy(s -> s
.chars()
.sorted()
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString()))
.values()));
}
解析:
这段代码的目的是将给定的字符串数组 strs
按照它们的字符排序后的形式进行分组,并输出每个分组中的字符串列表。在这里,通过使用 Java 的 Stream API,代码实现了以下步骤:
-
使用
stream
方法创建流:Arrays.stream(strs)
将字符串数组strs
转换为一个流。 -
使用
collect
收集器进行分组:.collect(Collectors.groupingBy(...))
使用groupingBy
收集器,根据指定的分类函数对流中的元素进行分组。在这里,分类函数是字符串按字符排序后的形式。 -
分类函数的实现: 对于每个字符串,使用
chars()
方法获取其字符流,然后使用sorted()
进行排序。接着,通过collect
方法将排序后的字符连接为一个字符串,最终得到按字符排序后的形式。 -
将分组结果转换为列表:
.values()
取出分组后的所有值(即每个分组中的字符串列表),并将其转换为列表。 -
输出结果: 将最终的结果转换为
ArrayList
,并通过System.out.println
输出。
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
这段代码使用 collect
方法将排序后的字符连接为一个字符串。具体来说,它是通过 StringBuilder
对象进行收集的,并使用三个参数的 collect
方法,这三个参数分别是:
-
Supplier 参数 (
StringBuilder::new
): 这是一个提供者参数,用于创建结果容器。在这里,StringBuilder::new
表示创建一个新的空StringBuilder
对象,用于存储收集的字符。 -
Accumulator 参数 (
StringBuilder::appendCodePoint
): 这是一个累加器参数,用于将流中的元素累积到结果容器中。StringBuilder::appendCodePoint
表示使用appendCodePoint
方法将流中的字符代码点(code point)追加到StringBuilder
中。这个方法是专门用于处理 Unicode 码点的方法,与append
方法不同之处在于可以正确处理代理对(surrogate pair)。 -
Combiner 参数 (
StringBuilder::append
): 这是一个组合器参数,用于在并行流的情况下合并部分结果。