在地图中对对象进行分组

时间:2012-11-29 11:43:23

标签: java

这可能是微不足道的,但我需要确保以正确的方式做到这一点。

我有一个具有属性country_id的人物对象。我需要根据country_id对人员进行分组,然后最终将其打包成1个Map对象。 Map应该将键作为country_id,并将其值作为属于country_id.的人物对象的列表

所以流程应该是:

  • 通过人物对象
  • 查找country_id并输入一个列表。例如list_A中的person A(id=10)
  • 同样在list_B中person B(id-20)
  • 然后把它们放在HashMap中?

我的最终o / p应为PersonMap(country_id-<PersonList>,country_id-<PersonList> )

这种方法是正确的还是有更好的方法?

4 个答案:

答案 0 :(得分:3)

您可以在循环播放时将人员放入Map。只需在地图中查找所需的列表,如果找不到,请将其创建并放入地图中。

假设country_idint而未使用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,然后您的人物对象可以按国家/地区排序。