Группировать по имени поля в Java - PullRequest
17 голосов
/ 22 марта 2011

Я пытаюсь сгруппировать объекты Java по их полю, т.е. Person.java

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

Так что, если у меня есть n Объекты Person, какой самый простой способ заставить всех людей с именем "David" добавить на карту типа Map<String, List<Person>> map;?

Я нашел это в Google (но он не компилируется), похоже, это то, что я ищу: http://www.anzaan.com/2010/06/grouping-objects-using-objects-property/

Ответы [ 7 ]

54 голосов
/ 22 марта 2011

Вероятно, есть библиотека, которая может сделать это проще, но это не так сложно сделать вручную:

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");
26 голосов
/ 05 января 2014

Используя с классом Collectors и потоками , вы можете сделать это:

Map<String, List<Person>> mapByName = 
    allPeople.stream().collect(Collectors.groupingBy(Person::getName));

List<Person> allDavids = mapByName.getOrDefault("David", Collections.emptyList());

Здесь яиспользовал getOrDefault, так что вы получите пустой неизменяемый список вместо ссылки null, если в исходном списке нет «Дэвида», но вы можете использовать get, если предпочитаете иметь значение null.

Надеюсь, это поможет!:)

11 голосов
/ 19 апреля 2013

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

4 голосов
/ 22 марта 2011

что-то в этом роде (я не компилировал)

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);
}
1 голос
/ 26 марта 2016

Вы можете использовать Мультикарта и groupBy() из Коллекции Eclipse

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 голос
/ 22 марта 2011

В Scala это уже функция класса List:

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)), (Сью, List (Person @ 11471c6)), (Джо, List (Person @ d320e4))))

Поскольку Scala является байт-кодом, совместимым сJava, вы должны иметь возможность вызывать этот метод из Java, если вы включите jar-файлы scala.

0 голосов
/ 22 марта 2011

Прежде всего, вы должны добавить объекты Person.java в arraylist, позже мы можем получить эти подробности следующим образом

public void addPerson () {

ArrayList presonList= новый ArrayList ();

для (int i = 0; i <= presonList.size (); i ++) {</p>

Person obj = presonList.get (i);

// теперь делаем все, чтобы получить индивидуальную переменную здесь

}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...