Java 8 : Filter an Array(NxM) to create a Map<String, 哈希集<字符串>>

标签 java arrays lambda java-8 hashmap

我想将 NxN 数组映射到 Java 8 中的 Map。

想法是每个 [i][0] 元素都是一个键,每个 [i][j] 且 j>0 是映射中每个键的值列表。

感谢您的帮助。 :)

这是我的课:

public class GroupingDishes {

    public static void main(String[] args) {

        String[][] dishes = {
                {"Salad", "Tomato", "Cucumber", "Salad", "Sauce"},
                {"Pizza", "Tomato", "Sausage", "Sauce", "Dough"},
                {"Quesadilla", "Chicken", "Cheese", "Sauce"},
                {"Sandwich", "Salad", "Bread", "Tomato", "Cheese"}
        };

        Map<String, HashSet<String>> groupDishes = groupingDishes(dishes);
    }

    public static Map<String, HashSet<String>> groupingDishes(String[][] dishes) {

        Map<String, HashSet<String>> mapFood = new HashMap<>();

        for (int i = 0; i < dishes.length; i++) {

            String food = dishes[i][0];

            for (int j = 0; j < dishes[i].length; j++) {

                if (mapFood.containsKey(food)) {

                    HashSet<String> existingIngredients = mapFood.get(dishes[i][0]);
                    existingIngredients.add(dishes[i][j]);
                    mapFood.put(food, existingIngredients);

                } else {

                    HashSet<String> newIngredient = new HashSet<>();
                    mapFood.put(food, newIngredient);

                }
            }
        }
        return mapFood;
    }
}

最佳答案

您可以转换 String[][]String[] 的流, 然后收集到一张 map , 使用 String[] 的第一项作为关键, 其余的作为集合的值。

public static Map<String, HashSet<String>> groupingDishes2(String[][] dishes) {
    return Arrays.stream(dishes)
        .collect(Collectors.toMap(
            arr -> arr[0],
            arr -> Arrays.stream(arr).skip(1).collect(Collectors.toCollection(HashSet::new))));
}

顺便说一句,我怀疑你真的需要 Map<String, HashSet<String>> . 最好将类型更改为 Map<String, Set<String>> , 然后实现也可以写得更简单。

public static Map<String, Set<String>> groupingDishes(String[][] dishes) {
    return Arrays.stream(dishes)
        .collect(Collectors.toMap(
            arr -> arr[0],
            arr -> Arrays.stream(arr).skip(1).collect(Collectors.toSet())));
}

或者甚至更好,正如@Holger 所建议的,一个更好的选择,因为“带有skiplimit 的流表现不是很好,而且Collectors 没有得到任何结果初始值的提示容量”:

public static Map<String, Set<String>> groupingDishes(String[][] dishes) {
    return Arrays.stream(dishes)
        .collect(Collectors.toMap(
            arr -> arr[0],
            arr -> new HashSet<>(Arrays.asList(arr).subList(1, arr.length))));
}

关于Java 8 : Filter an Array(NxM) to create a Map<String, 哈希集<字符串>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47442973/

相关文章:

python - 如何将具有多个参数的函数传递给 python concurrent.futures.ProcessPoolExecutor.map()?

Java Lambda 单个流上的多个操作

java - 如何在 hibernate 中忽略加载中的对象引用重用?

从子类调用方法的 JUnit 案例中的 Java 失败

java - 搜索 ArrayList

java - 无法在 Fragment 内的 onResume() 方法中检索 View

javascript:构建数组项的条件

字符串数组的 C++ vector ?

c++ - 这段 C++ 代码如何在 GCC 而不是 Visual C++ 中运行?

java - Lambda 表达式条件的代码覆盖率单元测试