首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学习java 8

学习java 8
EN

Stack Overflow用户
提问于 2018-12-08 22:22:03
回答 5查看 126关注 0票数 1

我有一个现有的Java代码,我想用Java 8编写。

有人能提供将此代码移植到Java 8的建议吗?

代码语言:javascript
复制
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()

代码语言:javascript
复制
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());
    }
}

还有别的办法吗?

EN

回答 5

Stack Overflow用户

发布于 2018-12-08 22:30:43

您实际上是在寻找groupingBy收集器:

代码语言:javascript
复制
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构造函数并返回。

阅读时你可能会发现很有趣:

票数 3
EN

Stack Overflow用户

发布于 2018-12-08 22:43:10

Aomine的回答是好的,但可以改写得更短:

代码语言:javascript
复制
return strs == null? Collection.emptyList() : new ArrayList<>(Arrays.stream(strs)
        .collect(groupingBy(s -> Arrays.stream(s.split(""))
                .sorted()
                .collect(joining())))
        .values());
票数 1
EN

Stack Overflow用户

发布于 2018-12-08 23:40:05

这个答案提供了一个java流。解决方案,我个人会继续下去。至于您当前的实现,您已经非常接近了,但是computeIfAbsent将是进行以下操作的更好方法:

代码语言:javascript
复制
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)将单词添加到其中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53687559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档