0

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

我有一个具有 property 的 person 对象country_id。我需要根据country_id然后最后将人分组到 1 个 Map 对象中。地图应该有作为的键country_id和它的值作为属于那个的人员对象的列表country_id.

所以流程应该是:

  • 遍历人员对象
  • 查找country_id并放入列表中。例如person A(id=10)在 list_A
  • 同样person B(id-20)在 list_B
  • 然后把它们放到HashMap中?

我的最终操作应该是PersonMap(country_id-<PersonList>,country_id-<PersonList> )

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

4

4 回答 4

3

Guava有一个很好的索引方法,它返回一个由表达式索引的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 的分组功能可以获得更好、更流畅的 API :

Group<Person> group = group(personList, by(on(Person.class).getCountryId()));

但是,LambdaJ 的 Group 对象没有任何将其转换为地图的方法,因此您必须手动执行此操作。但也许您可以更改界面,以便您可以返回一个组。

于 2012-11-29T12:18:53.840 回答
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);
}
于 2012-11-29T11:47:08.393 回答
2

或者你可以使用 Google Guava 项目

使用 Google guava Multimap 和 Function 实现 GroupBy

这是使用 google guava Multimap 和 Function 通过类似功能为集合创建组的一种方法。

代码很简单,我们只需使用 的 index方法来对Multimap我们的数据进行分组,在这里我们使用我们的 2 列按部门对它进行分组。

样本输出

关键=开发
  1:格雷格
  3:罗马
关键 = 支持
  2:狮子座
  4:乔比
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;

public class GroupByMultimap {
    public static void main(String[] args) {
        Object[] o1 = new Object[] { 1, "Greg", "Dev" };
        Object[] o2 = new Object[] { 2, "Leo", "Support" };
        Object[] o3 = new Object[] { 3, "Roman", "Dev" };
        Object[] o4 = new Object[] { 4, "Jobby", "Support" };

        List<Object[]> rows = Lists.newArrayList(o1, o2, o3, o4);
        Multimap<String, Object[]> grouped = Multimaps.index(rows,
                new Function<Object[], String>() {
                    @Override
                    public String apply(Object[] item) {
                        return (String) item[2];
                    }
                });

        Iterator<String> keyIterator = grouped.asMap().keySet().iterator();
        while (keyIterator.hasNext()) {
            String key = keyIterator.next();
            System.out.println("key = " + key);
            Collection<Object[]> dataRows = grouped.get(key);
            for (Object[] o : dataRows) {
                System.out.println(String.format("  %d : %s", o[0], o[1]));
            }
        }
    }
}
于 2012-11-29T12:01:14.200 回答
0

您可以在使用国家 ID 作为比较值的人员对象上实现比较,然后您的人员对象可以按国家/地区排序。

于 2012-11-29T11:47:36.427 回答