java - 学习java 8

标签 java java-8

我有一个现有的 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) 方法获取流并将其转换为标准集合类型( MapList 等):

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() 从数据集中剥离键,然后包装生成的 CollectionArrayList :

new ArrayList<>(Arrays.stream(strs)
        .collect(Collectors.groupingBy(Solution::sortString))
        .values());

关于java - 学习java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53687559/

相关文章:

java - RCP 应用程序中的通知小部件

java - 即使应用程序正在使用中,也要创建 swt 应用程序的新实例

java - 无法从 Android 中的 httpResponse 检索所有数据

java - 渲染期间引发异常 : TabHost requires a TabWidget with id "android:id/tabs"

java - Java中TreeMap和LinkedHashMap的可视化

java - 为什么当我在静态 block 中不使用 "lambda method reference"代码风格时会导致死锁?

java - 使用 java 流解析列表

java - 如何使用流有条件地终止集合循环

java - ArrayOutOfBoundsException : asm. ClassReader.readClass(未知来源)

java - 如何从 ArrayList 中添加和删除重复的对象?