我正在尝试按其字段对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/
答案 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)
将java-8与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 Collections和group by CUSIPNumber, ForeignCountry
groupBy()
如果您无法从MutableList<Person> allPeople = Lists.mutable.empty();
MutableListMultimap<String, Person> multimapByName = allPeople.groupBy(Person::getName);
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);
//现在在这里做个别变量的事情
}
}