Группировать по имени поля в Java
Я пытаюсь группировать объекты Java по их полю, то есть Person.java
public class Person {
String name;
String surname;
....
}
Итак, если у меня есть n объектов Person, то какой самый простой способ заставить всех людей назвать "Давид" на карте, например Map<String, List<Person>> map;
?
Я нашел это в Google (но он не компилируется), похоже, это то, что я ищу:
http://www.anzaan.com/2010/06/grouping-objects-using-objects-property/
Ответы
Ответ 1
Вероятно, библиотека, которая может сделать это проще, но это не слишком сложно сделать вручную:
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");
Ответ 2
Использование java-8 с помощью 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
.
Надеюсь, это поможет!:)
Ответ 3
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
что-то вроде этого (я не компилировал)
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);
}
Ответ 5
В 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]] = Карта ((Давид, Список (Person @1c3f810, Person @139ba37)), (Sue, Список (Person @11471c6)), (Джо, список (Person @d320e4)))
Так как Scala является байт-кодом, совместимым с Java, вы должны иметь возможность вызвать этот метод из Java, если вы включите scala -jars.
Ответ 6
Вы можете использовать Multimap и 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.
Ответ 7
Прежде всего, вы должны добавить объекты Person.java в arraylist позже, мы можем вернуть эти детали ниже.
public void addPerson() {
ArrayList presonList = new ArrayList();
for (int я = 0; я <= presonList.size(); я ++) {
Лицо obj = presonList.get(i);
//теперь делаем материал для получения отдельной переменной здесь
}
}