Agrupar por nombre de campo en Java

Intento agrupar objetos Java por su campo, es decir, Person.java

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

Entonces, si tengo n objetos Person, ¿cuál sería la forma más fácil de hacer que todas las personas nombren “David” en un mapa como Map<String, List> map; ?

Encontré esto en Google (pero no comstack), parece ser lo que estoy buscando: http://www.anzaan.com/2010/06/grouping-objects-using-objects-property/

Probablemente haya una biblioteca que pueda hacer esto de manera más simple, pero no es demasiado difícil hacerlo manualmente:

 List allPeople; // your list of all people Map> map = new HashMap>(); for (Person person : allPeople) { String key = person.getName(); if (map.get(key) == null) { map.put(key, new ArrayList()); } map.get(key).add(person); } List davids = map.get("David"); 

Usando java-8 con la clase Collectors y las transmisiones , puede hacer esto:

 Map> mapByName = allPeople.stream().collect(Collectors.groupingBy(Person::getName)); List allDavids = mapByName.getOrDefault("David", Collections.emptyList()); 

Aquí usé getOrDefault para que pueda obtener una lista inmutable vacía en lugar de una referencia null si no hay “David” en la lista original, pero puede usar get si prefiere tener un valor null .

¡Espero eso ayude! 🙂

Multimap de Google Guava hace exactamente lo que necesita y mucho más, evitando mucho código repetitivo:

 ListMultimap peopleByFirstName = ArrayListMultimap.create(); for (Person person : getAllPeople()) { peopleByFirstName.put(person.getName(), person); } 

Fuente: http://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#Multimap

algo así (no compilé)

 void addPerson(Person p, Map> map){ ArrayList lst = map.get(p.name); if(lst == null){ lst = new ArrayList(); } lst.add(p); map.put(p.name, lst); } ... for(Person p:personsCollection>){ addPerson(p, map); } 

En Scala, esta es una característica de la lista de clase ya:

 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 (Persona @ d320e4)))

Como Scala es compatible con bytecode para Java, debería poder invocar ese método desde Java, si incluye los scala-jar.

Puede usar Multimap y groupBy() desde Eclipse Collections

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

Si no puede cambiar el tipo de todas las personas de la List

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

Nota: soy colaborador de las colecciones de Eclipse.

En primer lugar, debe agregar objetos de Person.java en la lista de arrays más tarde podemos recuperar esos detalles de la manera siguiente

public void addPerson () {

ArrayList presonList = new ArrayList ();

for (int i = 0; i <= presonList.size (); i ++) {

Persona obj = presonList.get (i);

// ahora hacemos cosas para obtener variables individuales aquí

}

}

Intereting Posts