有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何根据id对某些对象进行分组?

我有一些id为的对象。我希望根据id对对象进行分组。我的意思是,具有相同id的对象应该在一个组中。有什么想法吗

例如:

id Name

1 Allah

1 Mohammad

2 Ali

2 Fatemeh

2 Hassan

3 hossein

3 Mahdi

3 Reza

共 (3) 个答案

  1. # 1 楼答案

    如果你不想使用第三方图书馆,你可以使用谷歌的Guava图书馆。存在一个MultiMap将一个键映射到一个值列表see here。它的工作原理与Map<Integer, List<Person>>稍有不同。它有一些内置功能,比如values(),可以将所有列表中的所有值作为一个平面集合返回。哪种变体更合适取决于你想用地图做什么

  2. # 2 楼答案

    最简单的方法是使用番石榴多重贴图:

    Multimaps.index(myObjects, new Function<MyObject, Integer>() {
      public Integer apply(MyObject input) {
        return input.getId(); 
      }
    });
    

    这将产生一个多重映射,其中ID为单键,值为对象

    在Java8中,可以使用lambda表达式编写更简单的代码:

    Multimaps.index(myObjects, o -> o.getId());
    

    如果你不能使用番石榴,那么你需要自己实施这个行为,如卢卡斯·埃德的回答所示

    至于Guava,这是一个由Google开发的非常流行的库,其中包含大量常用的实用程序类、方法和高级集合类(如双向映射、多集和多映射)

    有关更多信息,请查看Guava Documentation

  3. # 3 楼答案

    假设你有这种类型:

    class Person {
        final int id;
        final String name;
        Person(int id, String name) {
            this.id = id;
            this.name = name;
        }
    }
    

    然后你可以写以下内容:

    List<Person> people = Arrays.asList(new Person(1, "Allah"), new Person(1, "Mohammad"), ..);
    Map<Object, List<Person>> peoplePerId = 
    people.stream()
          .collect(Collectors.groupingBy(p -> p.id));
    

    或者,也许更好:

    Map<Integer, List<String>> namesPerId = 
    people.stream()
          .collect(Collectors.groupingBy(
              p -> p.id,
              Collectors.mapping(p -> p.name, Collectors.toList())
          ));
    

    Java 8之前的版本:

    Map<Integer, List<String>> namesPerId = new HashMap<>();
    for (Person person : people) {
        List<String> list = namesPerId.get(person.id);
    
        if (list == null) {
            list = new ArrayList<>();
            namesPerId.put(person.id, list);
        }
    
        list.add(person.name);
    }