当前位置: 首页 > 知识库问答 >
问题:

如何将多个映射与多个相同的键和列表作为值组合起来?

江佐
2023-03-14
public class Student {
    private String name;
    private String country;

    //Setters and Getters
}
public class MapAdder {
    static Map<String, List<Student>> studentMap =
            new LinkedHashMap<String, List<Student>>();

    public static void addToMap(String key, Student student) {
        studentMap.computeIfAbsent(key,
                k -> new LinkedList<Student>()).add(student);
    }

    public static Map<String, List<Student>> getStudentMap() {
        return studentMap;
    }

    public static void clearStudentMap() {
        studentMap.clear();
    }
}

主要方法

public static void main(String[] args) {
    Map<String, List<Student>> studentMap1;
    Map<String, List<Student>> studentMap2;
    Map<String, List<Student>> studentMap3;

    MapAdder.addToMap("India", new Student("Mounish", "India"));
    MapAdder.addToMap("USA", new Student("Zen", "USA"));
    MapAdder.addToMap("India", new Student("Ram", "India"));
    MapAdder.addToMap("USA", new Student("Ronon", "USA"));
    MapAdder.addToMap("UK", new Student("Tony", "UK"));

    studentMap1 = MapAdder.getStudentMap();
    MapAdder.clearStudentMap();

    MapAdder.addToMap("India", new Student("Rivar", "India"));
    MapAdder.addToMap("UK", new Student("Loki", "UK"));
    MapAdder.addToMap("UK", new Student("Imran", "UK"));
    MapAdder.addToMap("USA", new Student("ryan", "USA"));

    studentMap2 = MapAdder.getStudentMap();
    MapAdder.clearStudentMap();

    Map<String, List<Student>> map3 = Stream.of(studentMap1, studentMap2)
            .flatMap(map -> map.entrySet().stream())
            .collect(Collectors.toMap(
                    Entry::getKey,
                    Entry::getValue
            ));
}

但当我尝试合并这两个地图时,我得到的是空地图。实际上,我需要有一个地图与三个键(印度,英国,美国)和他们的值,从多个地图列表合并W.R.T键。

共有1个答案

薄高懿
2023-03-14

首先,从代码中删除以下调用:

MapAdder.clearStudentMap();

您正在清除StudentMap1StudentMap2

当您这样做时:

studentMap1 = MapAdder.getStudentMap();
studentMap.clear();
studentMap1 = MapAdder.getStudentMap();
Map<String, List<Student>> map3 = Stream.of(studentMap1, studentMap2)
        .flatMap(map -> map.entrySet().stream())
        .collect(Collectors.toMap(
                Map.Entry::getKey,
                e -> new ArrayList<>(e.getValue()),
                (left, right) -> { left.addAll(right); return left; }
        ));
public class MapAdder {
    public static void addToMap(Map<String, List<Student>> studentMap,
                                String key, Student student) {
        studentMap.computeIfAbsent(key,
                k -> new LinkedList<Student>()).add(student);
    }

    public static void main(String[] args) {
        Map<String, List<Student>> studentMap1 = new LinkedHashMap<>();
        Map<String, List<Student>> studentMap2 = new LinkedHashMap<>();
        Map<String, List<Student>> studentMap3;

        MapAdder.addToMap(studentMap1, "India", new Student("Mounish", "India"));
        MapAdder.addToMap(studentMap1, "USA", new Student("Zen", "USA"));
        MapAdder.addToMap(studentMap1, "India", new Student("Ram", "India"));
        MapAdder.addToMap(studentMap1, "USA", new Student("Ronon", "USA"));
        MapAdder.addToMap(studentMap1, "UK", new Student("Tony", "UK"));

        MapAdder.addToMap(studentMap2, "India", new Student("Rivar", "India"));
        MapAdder.addToMap(studentMap2, "UK", new Student("Loki", "UK"));
        MapAdder.addToMap(studentMap2, "UK", new Student("Imran", "UK"));
        MapAdder.addToMap(studentMap2, "USA", new Student("ryan", "USA"));

        Map<String, List<Student>> map3 = Stream.of(studentMap1, studentMap2)
                .flatMap(map -> map.entrySet().stream())
                .collect(Collectors.toMap(
                        Map.Entry::getKey,
                        e -> new ArrayList<>(e.getValue()),
                        (left, right) -> { left.addAll(right); return left; }
                ));
    }
}
 类似资料:
  • 在这个问题中,我必须有一个带有键和字符串值的映射,以查看多个键是否映射到同一个值。换句话说,我的方法应该返回true,如果没有两个键映射到相同的值,则返回false。我尝试将所有地图放在一个集合中,检查每个元素,看看是否有两个相同值的副本;然而,这似乎对我不起作用。如有任何建议,将不胜感激,谢谢。 提示: 编写一个方法isUnique,该方法接受从字符串到字符串的映射作为参数,如果没有两个键映射到

  • 我有两个这样的等级: 和 我想使用hibernate持久化这两个类。字段messagesOfTypeA、messagesOfTypeB和messagesOfTypeC根据消息中的类型字段对消息对象进行分组。 如何使用XML hibernate映射映射MyClass和Message之间的一对多关系?(我正在使用Hibernate 3.6)

  • 问题内容: 我认为我的问题与此相似:如何实现具有多个键的Map?但有一个重要的区别。在这个问题中(如果我对它的理解是正确的,请告诉我是否正确),这些键应该总是唯一的。我想要一个Map形式: MyMap ,其中的键不一定是唯一的。如果那没有任何意义,我基本上想要一个二维数组,而不是通过坐标对引用元素,而是通过对象对引用它们。 是否有人对可以在其中工作的图书馆或自己实现此想法的好方法有任何想法?就库而

  • 问题内容: 我正在尝试建立一个PostgreSQL表,该表具有两个指向另一个表中相同主键的外键。 运行脚本时出现错误 sqlalchemy.exc.AmbiguousForeignKeysError:无法确定关系Company.stakeholder的父/子表之间的联接条件- 有多个链接表的外键路径。指定“ foreign_keys”参数,提供这些列的列表,这些列应被视为包含对父表的外键引用。 那

  • 设置:两个数据帧;需要将来自df2的数据添加到df1中,如下所述: df1和df2使用相同的四个级别进行多重索引 df1比df2包含更多的行 df1在索引的四个级别中的三个级别中的每个唯一组合都有三个值的副本(以行为单位);也就是说,每行仅相对于第4个级别有所不同 df2在其他3个级别上只与df1部分对齐(df2包含无关行) df2只包含一列 我想将df2的一列中的值添加到df1中三个对应级别匹配

  • 嗨,下面是我的实体,它们之间有许多联系 大学生JAVA 学生详细信息。JAVA appmain.java 下面是我的2表中的列 “学生详细信息”中的“值”应输入学生表的“用户角色” 但当我执行appmain时,我的错误率就降低了 我试图解决这个问题,但它显示出同样的错误请建议我如何解决这个问题