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

Java 如何根据id对某些对象进行分组?,java,split,Java,Split,我有一些id为的对象。我希望根据id对对象进行分组。我的意思是,具有相同id的对象应该在一个组中。有什么想法吗 例如: id Name 1 Allah 1 Mohammad 2 Ali 2 Fatemeh 2 Hassan 3 hossein 3 Mahdi 3 Reza 假设您有这种类型: class Person { final int id; final String name; Person(int id, String name) {

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

例如:

id Name

1 Allah

1 Mohammad

2 Ali

2 Fatemeh

2 Hassan

3 hossein

3 Mahdi

3 Reza

假设您有这种类型:

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));
List people=Arrays.asList(新人(1,“真主”)、新人(1,“穆罕默德”)、;
映射peoplePerId=
people.stream()
.collect(收集器.groupingBy(p->p.id));
或者,也许更好:

Map<Integer, List<String>> namesPerId = 
people.stream()
      .collect(Collectors.groupingBy(
          p -> p.id,
          Collectors.mapping(p -> p.name, Collectors.toList())
      ));
Map namesPerId=
people.stream()
.collect(收集器.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);
}
Map namesPerId=new HashMap();
用于(人:人){
List List=namesPerId.get(person.id);
if(list==null){
列表=新的ArrayList();
namesPerId.put(person.id,list);
}
列表.添加(人员.姓名);
}

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

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

Multimaps.index(myObjects, new Function<MyObject, Integer>() {
  public Integer apply(MyObject input) {
    return input.getId(); 
  }
});
如果你不能使用番石榴,那么你需要自己实现这个行为,如卢卡斯·埃德尔的回答所示

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


有关更多信息,请查看。

使用
java.util.Map
(key=id,value=list of names)?TNX以获得答复。我有个问题。我在“MappeoplePerID=people.stream().collect(Collectors.groupingBy(p->p.id));“我有netbeans IDE 7.4,所以你认为这会造成问题吗?”上找不到.stream()方法。在我的示例中,我在
列表上调用了
流()
(即
集合
)<代码>地图
不是收藏。对不起。我还没拿到你的密码。你能告诉我更多关于你的情况吗。我对stream()和collect()感到困惑。@Arashm:我建议阅读关于新Java8API的教程:哦,太好了,我没有意识到这一点。穿上兰姆达会更好看!哦,我不习惯使用这个图书馆。你能让我知道更多吗?在答案中添加了lambda版本和番石榴的链接
Multimaps.index(myObjects, o -> o.getId());