在Java中按字段名称分组

时间:2011-03-21 23:45:25

标签: java dictionary grouping

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

public class Person {
    String name;
    String surname;
    ....
}

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

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

7 个答案:

答案 0 :(得分:54)

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

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

答案 1 :(得分:26)

Collectors班级和streams一起使用,您可以这样做:

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

List<Person> allDavids = mapByName.getOrDefault("David", Collections.emptyList());

在这里,我使用getOrDefault,这样如果原始列表中没有“David”,您将获得一个空的不可变列表而不是null引用,但如果您使用get,则可以使用null您希望拥有{{1}}值。

希望它有所帮助! :)

答案 2 :(得分:11)

Google Guava的Multimap完全符合您的需求,而且更多,避免了很多样板代码:

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

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

答案 3 :(得分:4)

类似的东西(我没编译)

void addPerson(Person p, Map<String, List<Person>> map){
  ArrayList<Person> lst = map.get(p.name);
  if(lst == null){
     lst = new ArrayList<Person>();
  }
  lst.add(p);
  map.put(p.name, lst);
}
...
for(Person p:personsCollection>){
   addPerson(p, map);
}

答案 4 :(得分:1)

在Scala中,这已经是类List的一个功能:

class Person (val name: String, val surname: String ="Smith") 
val li = List (new Person ("David"), new Person ("Joe"), new Person ("Sue"), new Person ("David", "Miller")) 
li.groupBy (_.name)
  

res87:   scala.collection.immutable.Map [字符串,列表[人物]   =地图((David,List(Person @ 1c3f810,Person @ 139ba37)),   (苏,列表(人@ 11471c6)),   (乔,列表(人@ d320e4)))

由于Scala与Java的字节码兼容,因此如果包含scala-jar,则应该能够从Java调用该方法。

答案 5 :(得分:1)

您可以使用Multimap

中的Eclipse Collectionsgroup by CUSIPNumber, ForeignCountry
groupBy()

如果您无法从MutableList<Person> allPeople = Lists.mutable.empty(); MutableListMultimap<String, Person> multimapByName = allPeople.groupBy(Person::getName);

更改allPeople的类型
List

注意:我是Eclipse Collections的撰稿人。

答案 6 :(得分:-1)

首先,您应该在arraylist中添加Person.java的对象,稍后我们可以通过以下方式获取这些详细信息

  

public void addPerson(){

     

ArrayList presonList = new ArrayList();

     

for(int i = 0; i&lt; = presonList.size(); i ++){

     

Person obj = presonList.get(i);

     

//现在在这里做个别变量的事情

     

}

     

}