0

これは些細なことかもしれませんが、正しい方法で行うようにする必要があります。

プロパティを持つ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に配置しますか?

私の最終的なo/pはPersonMap(country_id-<PersonList>,country_id-<PersonList> )

このアプローチは正しいですか、それともより良いアプローチがありますか?

4

4 に答える 4

3

Guavaには、式によってインデックス付けされたマルチマップを返す優れたインデックスメソッドがあります。

ListMultimap<Integer, Person> multimap = Multimaps.index(personList, new Function<Person, Integer>(){
  public Integer apply(Person source){
    return source.getCountryId();
  }
});

マルチマップ自体は、必要に応じてマップとして表示できます。

Map<Integer, Collection<Person>> map = multimap.asMap();

さらに優れた流暢なAPIは、LambdaJのグループ化関数を介して利用できます。

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

ただし、LambdaJのGroupオブジェクトには、それをマップに変換するメソッドがないため、これを手動で行う必要があります。ただし、グループを返すことができるようにインターフェイスを変更できる場合もあります。

于 2012-11-29T12:18:53.840 に答える
3

Mapあなたは彼らをループするときに人々を入れることができます。マップで必要なリストを探すだけで、見つからない場合はリストを作成してマップに配置します。

それがどのように機能するかわからないので、を使用していないcountry_idと仮定します。intPersonMap

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

または、GoogleGuavaプロジェクトを使用できます

Googleguavaマルチマップと関数を使用したGroupByの実装

これは、google guava MultimapandFunctionを使用してコレクションの機能のようにグループを作成する1つの方法です。

コードは単純で、の 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を使用するpersonオブジェクトに比較対象を実装すると、personオブジェクトを国別に並べ替えることができます

于 2012-11-29T11:47:36.427 に答える