web-dev-qa-db-ja.com

Java)のフィールド名でグループ化

Javaオブジェクトをフィールドでグループ化しようとしています。つまりPerson.Java

public class Person {
    String name;
    String surname;
    ....
}

したがって、nのPersonオブジェクトがある場合、すべての人の名前「David」をMap<String, List<Person>> map;のようなマップに入れる最も簡単な方法は何でしょうか。

私はこれをグーグルで見つけました(しかしそれはコンパイルされません)、それは私が探しているもののようです: http://www.anzaan.com/2010/06/grouping-objects-using-オブジェクト-プロパティ/

17
London

これをもっと簡単にできるライブラリがあるかもしれませんが、手動で行うのはそれほど難しくありません。

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");
56
Kaleb Brasee

Java-8Collectors クラスおよび 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の値が必要です。

それが役に立てば幸い! :)

27
Alexis C.

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

11
GFonte

そのようなもの(私はコンパイルしませんでした)

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
Nazarii Bardiuk

Scalaでは、これはすでにクラスリストの機能です。

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 [String、List [Person]] = Map((David、List(Person @ 1c3f810、Person @ 139ba37))、(Sue、List(Person @ 11471c6))、(Joe、List (Person @ d320e4)))

ScalaはJavaと互換性のあるバイトコードであるため、scala-jarを含めると、Javaからそのメソッドを呼び出すことができるはずです。

1
user unknown

Multimap およびgroupBy() from Eclipse Collections を使用できます

MutableList<Person> allPeople = Lists.mutable.empty();
MutableListMultimap<String, Person> multimapByName = allPeople.groupBy(Person::getName);

AllPeopleのタイプをListから変更できない場合

List<Person> allPeople = new ArrayList<>();
MutableListMultimap<String, Person> multimapByName = 
     ListAdapter.adapt(allPeople).groupBy(Person::getName);

注:私はEclipseコレクションの寄稿者です。

1