这可能是微不足道的,但我需要确保以正确的方式做到这一点。
我有一个具有属性country_id
的人物对象。我需要根据country_id
对人员进行分组,然后最终将其打包成1个Map对象。 Map应该将键作为country_id
,并将其值作为属于country_id.
的人物对象的列表
所以流程应该是:
country_id
并输入一个列表。例如list_A中的person A(id=10)
person B(id-20)
我的最终o / p应为PersonMap(country_id-<PersonList>,country_id-<PersonList> )
这种方法是正确的还是有更好的方法?
答案 0 :(得分:3)
您可以在循环播放时将人员放入Map
。只需在地图中查找所需的列表,如果找不到,请将其创建并放入地图中。
假设country_id
是int
而未使用PersonMap
,因为我不知道它是如何运作的:
Map<Integer,List<Person>> map = new HashHap<Integer,List<Person>>();
for (Person person : collectionOfPeople) {
int cid = person.getCountryId();
List<People> list = map.get(cid);
if (list == null) {
list = new ArrayList<People>();
map.put(cid,list);
}
list.add(person);
}
答案 1 :(得分:3)
Guava有一个很好的index方法,可以返回由表达式索引的 Multimap 。
ListMultimap<Integer, Person> multimap = Multimaps.index(personList, new Function<Person, Integer>(){
public Integer apply(Person source){
return source.getCountryId();
}
});
如果您需要,可以将Multimap本身视为地图:
Map<Integer, Collection<Person>> map = multimap.asMap();
通过LambdaJ's grouping function提供了更好,更流畅的API:
Group<Person> group = group(personList, by(on(Person.class).getCountryId()));
但是,LambdaJ的Group对象没有任何将其转换为地图的方法,因此您必须手动执行此操作。但也许您可以更改界面以便返回组。
答案 2 :(得分:2)
或者您可以使用Google Guava项目
使用Google番石榴Multimap和功能实现GroupBy
这是使用google guava Multimap和Function通过类似功能为集合创建组的一种方法。
代码很简单我们只需使用index
的{{1}}方法对数据进行分组,在这里我们使用2列将其分组。
key = Dev 1 : Greg 3 : Roman key = Support 2 : Leo 4 : Jobby
Multimap
答案 3 :(得分:0)
您可以在使用国家/地区ID作为值进行比较的人物对象上实施comparable,然后您的人物对象可以按国家/地区排序。