按Java中的字段名分组

Lon*_*don 17 java grouping dictionary

我正在尝试按其字段(即Person.java)对Java对象进行分组

public class Person {
    String name;
    String surname;
    ....
}
Run Code Online (Sandbox Code Playgroud)

因此,如果我有n个 Person对象,那么让所有人将"David"命名为地图的最简单方法是Map<String, List<Person>> map;什么?

我在Google上发现了这个(但它没有编译),它似乎是我正在寻找的东西:http: //www.anzaan.com/2010/06/grouping-objects-using-objects-property/

Kal*_*see 55

可能有一个库可以更简单地执行此操作,但手动执行并不困难:

List<Person> allPeople; // your list of all people
Map<String, List<Person>> map = new HashMap<String, List<Person>>();
for (Person person : allPeople) {
   String key = person.getName();
   if (map.get(key) == null) {
      map.put(key, new ArrayList<Person>());
   }
   map.get(key).add(person);
}

List<Person> davids = map.get("David");
Run Code Online (Sandbox Code Playgroud)

  • @lliaG,现在使用Java 8 [can](http://zeroturnaround.com/rebellabs/java-8-explained-applying-lambdas-to-java-collections/):) (6认同)
  • 可怜的Java人......他们永远不会知道LINQ的乐趣:) (4认同)
  • 除非他们使用Groovy(或Scala)并使用闭包执行以下操作,我认为这与LINQ一样简单.`def davids = allPeople.findAll {p - > p.name =='David'}` (2认同)

Ale*_* C. 26

Collectors类和流一起使用,您可以这样做:

Map<String, List<Person>> mapByName = 
    allPeople.stream().collect(Collectors.groupingBy(Person::getName));

List<Person> allDavids = mapByName.getOrDefault("David", Collections.emptyList());
Run Code Online (Sandbox Code Playgroud)

在这里,我使用getOrDefaultnull如果原始列表中没有"David" ,您将获得一个空的不可变列表而不是引用,但get如果您希望拥有null值,则可以使用.

希望能帮助到你!:)


GFo*_*nte 11

Google Guava的Multimap完全满足您的需求,并且更多,避免了很多样板代码:

ListMultimap<String, Person> peopleByFirstName = ArrayListMultimap.create();
for (Person person : getAllPeople()) {
    peopleByFirstName.put(person.getName(), person);
}
Run Code Online (Sandbox Code Playgroud)

资料来源:http://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#Multimap