如何基于id对一些对象进行分组?

时间:2015-08-15 07:49:59

标签: java split

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

例如:

id Name

1 Allah

1 Mohammad

2 Ali

2 Fatemeh

2 Hassan

3 hossein

3 Mahdi

3 Reza

2 个答案:

答案 0 :(得分:2)

假设你有这种类型:

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);
}

答案 1 :(得分:1)

如果您不愿意使用第三方库,则可以使用Google的Guava库。存在将MultiMap映射到值列表see hereMap<Integer, List<Person>>。它与values()略有不同。它有一些内置功能,如RewriteCond $1 !^(index\.php|robots\.txt|style\.css|sitemap\.xml) RewriteCond %{REQUEST_URI} !/img/ [NC] RewriteRule ^(.*)$ - [F] ,可将所有列表中的所有值作为平面集合返回。哪种变体更适合取决于您想要对地图做什么。