我有一个现有的 Java 代码,我想用 Java 8 编写。
有人可以提供将此代码移植到 Java 8 的建议。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> result = new ArrayList();
Map<String, List<String>> map = new HashMap();
if (strs == null || strs.length == 0) return result;
for (String word: strs) {
char[] wordArr = word.toCharArray();
Arrays.sort(wordArr);
String sortedWord = new String(wordArr);
if (map.containsKey(sortedWord)) {
List<String> list = map.get(sortedWord);
list.add(word);
map.put(sortedWord, list);
} else {
List<String> list = new ArrayList();
list.add(word);
map.put(sortedWord, list);
}
}
return new ArrayList(map.values());
}
}
更新 - 我使用了 getOrDefault()
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> result = new ArrayList();
Map<String, List<String>> map = new HashMap();
if (strs == null || strs.length == 0) return result;
for (String word: strs) {
char[] wordArr = word.toCharArray();
Arrays.sort(wordArr);
String sortedWord = new String(wordArr);
List<String> list = map.getOrDefault(sortedWord, new ArrayList());
list.add(word);
map.put(sortedWord, list);
}
return new ArrayList(map.values());
}
}
还有其他办法吗?
最佳答案
这是我使用流可以想到的最佳解决方案:
public class Solution {
private static String sortString(String str) {
char[] chars = str.toCharArray();
Arrays.sort(chars);
return new String(chars);
}
public List<List<String>> groupAnagrams(String[] strs) {
if (strs == null) {
return new ArrayList<>();
}
return new ArrayList<>(Arrays.stream(strs)
.collect(Collectors.groupingBy(Solution::sortString))
.values());
}
}
注意事项:
从简单开始,我们从数组 strs
创建一个流使用实用方法 Arrays.stream(array)
:
Arrays.stream(strs);
Stream#collect(collector)
方法获取流并将其转换为标准集合类型( Map
、 List
等):
Arrays.stream(strs)
.collect(...);
在这种情况下,我们将使用 Collectors.groupingBy(classifier)
.此收集器将您的流分类为“bins”,bin 标签由通过 classifier
传递每个值的结果指定。 lambda 函数。返回类型是 Map<K, List<V>>
(其中 K
是标签类型,V
是我们流式传输的任何类型)- 与您用于 map
的形状相同变量:
Arrays.stream(strs)
.collect(Collectors.groupingBy(...));
但是我们传递什么函数.groupingBy()
?由于您希望按排序后的字符串进行分组,因此我们需要一个函数来从常规字符串创建排序后的字符串。为此,我们将使用您现有的功能:
Arrays.stream(strs)
.collect(Collectors.groupingBy(str -> {
char[] chars = word.toCharArray();
Arrays.sort(chars);
return new String(chars);
}));
尽管如此,为了流式传输,我们将该函数替换为另一个流*:(事实证明 char
流式传输效果不佳)
为了整洁起见,我已将 lambda 函数重构为您类中的静态方法:
private static String sortString(String str) {
char[] chars = str.toCharArray();
Arrays.sort(chars);
return new String(chars);
}
Arrays.stream(strs)
.collect(Collectors.groupingBy(str -> {
return Solution.sortString(str);
}));
因为我们对一个只接受一个参数的函数进行一次调用,所以我们可以使用方法引用而不是 lambda 函数:
Arrays.stream(strs)
.collect(Collectors.groupingBy(Solution::sortString));
其余部分与您现有的代码非常相似。使用 Map#values()
从数据集中剥离键,然后包装生成的 Collection
在ArrayList
:
new ArrayList<>(Arrays.stream(strs)
.collect(Collectors.groupingBy(Solution::sortString))
.values());
关于java - 学习java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53687559/