代码之家  ›  专栏  ›  技术社区  ›  John Smith

Java按值对映射进行分组,其中值为列表

  •  0
  • John Smith  · 技术社区  · 3 年前

    我有一个

    Map<String,List<User>>map = new HashMap<>();
    map.put("projectA",Arrays.asList(new User(1,"Bob"),new User(2,"John"),new User(3,"Mo")));
    map.put("projectB",Arrays.asList(new User(2,"John"),new User(3,"Mo")));
    map.put("projectC",Arrays.asList(new User(3,"Mo")));
    

    可以使用字符串而不是用户。

    String是一个项目名称,但相同的用户可以关联到不同的项目。

    我想得到一些像 Map<User, List<String>> 哪里 该键将代表一个不同的用户和一个值,作为他/她所关联的项目名称列表。

    Bob  = [projectA]
    John = [projectA, projectB]
    Mo   = [projectA, projectB, projectC]
    

    提前TQ获取任何建议。

    1 回复  |  直到 3 年前
        1
  •  1
  •   f1sh    3 年前

    只需循环浏览地图条目和其中的列表:

    public static void main(String[] args) {
      Map<String, List<User>> map = new HashMap<>();
      map.put("projectA", Arrays.asList(new User(1,"Bob"),new User(2,"John"),new User(3,"Mo")));
      map.put("projectB",Arrays.asList(new User(2,"John"),new User(3,"Mo")));
      map.put("projectC",Arrays.asList(new User(3,"Mo")));
    
      Map<User, List<String>> result = new HashMap<>();
      for(Map.Entry<String, List<User>> e:map.entrySet()) {
        for(User u:e.getValue()) {
          result.putIfAbsent(u, new ArrayList<>());
          result.get(u).add(e.getKey());
        }
      }
      System.out.println(result);
    }
    public static record User(int id, String name) {}
    

    打印

    {User[id=1, name=Bob]=[projectA], User[id=2, name=John]=[projectB, projectA], User[id=3, name=Mo]=[projectB, projectA, projectC]}