我有一个现有的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());
}
}还有别的办法吗?
发布于 2018-12-08 22:30:43
您实际上是在寻找groupingBy收集器:
List<List<String>> groupAnagrams(String[] strs) {
if (strs == null || strs.length == 0)
return new ArrayList<>();
return new ArrayList<>(Arrays.stream(strs)
.collect(groupingBy(s -> Arrays.stream(s.split(""))
.sorted()
.collect(joining())))
.values());
}首先,我们在调用Arrays.stream(strs)时创建一个流,该流使我们能够使用collect执行还原操作,该方法将消耗一个收集器,其中该收集器是一个groupingBy。
groupingBy收集器的这种过载产生一个Map<K, List<T>>,其中键是将分类函数应用于输入元素(即Arrays.stream(s.split("")).sorted().collect(joining()))所产生的值,其相应值是包含映射到分类函数下关联键的输入元素的列表。
最后,我们调用values()检索Collection<List<String>>并将其传递给ArrayList构造函数并返回。
阅读时你可能会发现很有趣:
发布于 2018-12-08 22:43:10
Aomine的回答是好的,但可以改写得更短:
return strs == null? Collection.emptyList() : new ArrayList<>(Arrays.stream(strs)
.collect(groupingBy(s -> Arrays.stream(s.split(""))
.sorted()
.collect(joining())))
.values());发布于 2018-12-08 23:40:05
这个答案提供了一个java流。解决方案,我个人会继续下去。至于您当前的实现,您已经非常接近了,但是computeIfAbsent将是进行以下操作的更好方法:
List<List<String>> groupAnagrams(String[] strs) {
if (strs == null || strs.length == 0) return new ArrayList<>();
Map<String, List<String>> map = new HashMap<>();
for (String word : strs) {
char[] wordArr = word.toCharArray();
Arrays.sort(wordArr);
map.computeIfAbsent(new String(wordArr), k -> new ArrayList<>()).add(word);
}
return new ArrayList<>(map.values());
}我确信您知道大多数代码所做的事情,所以我只会引用大部分文档来解释上面的computeIfAbsent部分,因为这是最好的解释。
如果指定的键(
new String(wordArr))尚未与值关联(或映射为null),则尝试使用给定的映射函数(k -> new ArrayList<>())计算其值,并将其输入到此映射中,除非为null。
下次尝试添加映射中已经存在的键时,将返回与指定键关联的现有列表,并使用上面的.add(word)将单词添加到其中。
https://stackoverflow.com/questions/53687559
复制相似问题