Tengo una lista de MyObjects ... MyObject {int id, String name}. Ahora quiero dividir la lista en sublistas que tienen valores idénticos de "id", ¿alguien puede sugerir un enfoque eficiente para hacer esto?dividir una colección java en sub colecciones basadas en una propiedad de objeto
Respuesta
// create the thing to store the sub lists
Map<Integer, List<MyObject>> subs = new HashMap<Integer, List<MyObject>>();
// iterate through your objects
for(MyObject o : list){
// fetch the list for this object's id
List<MyObject> temp = subs.get(o.getId());
if(temp == null){
// if the list is null we haven't seen an
// object with this id before, so create
// a new list
temp = new ArrayList<MyObject>();
// and add it to the map
subs.put(o.getId(), temp);
}
// whether we got the list from the map
// or made a new one we need to add our
// object.
temp.add(o);
}
Pasa por los elementos, comprueba sus valores id
y colócalos en Hashtable
con id
como la clave. Eso es O (N), que es tan eficiente como lo que obtendrás.
¿Y qué hay del valor? –
@Kirk - Eso depende de cómo lo use el OP. Con un objeto tan trivial podría ser conveniente tener 'nombre' como valor, sin embargo, en muchas situaciones, tendría más sentido que el valor fuera el objeto en sí: no es una pregunta a la que pueda responder sin más contexto. –
ArrayList<MyObject> list=new ArrayList<MyObject>();
//fill Objects..
HashMap<Integer,ArrayList<MyObject>> hash=new HashMap<Integer,ArrayList<MyObject>>();
for(MyObject elem:list)//iterate the list
{
ArrayList<MyObject> tmp=null; //temporary variable
if((tmp=hash.get(elem.getId()))==null) // check if id already present in map
{
tmp=new ArrayList<MyObject>();
hash.put(elem.getId(),tmp); //if not put a new array list
}
names.add(elem); //if present add the name to arraylist
}
+1, el valor es una lista. –
nombres nunca se vuelve no nulo en esta solución en el caso de que tenga que agregar una nueva ArrayList. –
@Mark: No probé el código. Gracias por señalar. – Emil
Usando Guava:
ListMultimap<Integer, MyObject> myObjectsById = Multimaps.index(myObjects,
new Function<MyObject, Integer>() {
public Integer apply(MyObject myObject) {
return myObject.id;
}
});
O, al usar Java 8: ListMultimap
El uso de JDK 1.8:
List<MyObject> objects= new ArrayList();
Map<Integer, List<MyObject>> obejctMap = new HashMap();
objects.stream().map(MyObject::getId).distinct().forEach(id -> obejctMap .put(id,
objects.stream().filter(object -> id.equals(object.getId())).collect(Collectors.toList())));
Si está utilizando JDK 1.8, puede utilizar una solución elegante como:
Map<Integer, List<MyObject>> myObjectsPerId =
myObjects.stream().collect(Collectors.groupingBy(MyObject::getId));
- 1. VBA - Cómo agregar una colección a una colección de colecciones
- 2. Dividir una matriz en algunos sub-arrays
- 3. Cómo ordenar una colección basada en una propiedad de subcolección
- 4. ¿LINQ admite de forma nativa dividir una colección en dos?
- 5. Una colección que representa una concatenación de dos colecciones en Java
- 6. ¿Por qué guava Multimap.values () devuelve una colección plana en lugar de una colección de colecciones?
- 7. Monitor de cambios en una colección
- 8. cómo combinar una colección de colecciones en Linq
- 9. se cruzan una colección de colecciones en LINQ
- 10. ¿Hay una funcionalidad 'contiene' en una propiedad de colección de un objeto de dominio para createCriteria?
- 11. ¿Cómo codigo una propiedad con sub-propiedades?
- 12. Entrevista: diseñe un iterador para una colección de colecciones
- 13. Backbone.js Colección de colecciones
- 14. Colecciones Java: ¿qué colección usar y cuándo?
- 15. colecciones java vs mapa en colecciones framework
- 16. ¿Cómo combinar dos listas basadas en una propiedad?
- 17. Consultar y actualizar una propiedad en una colección usando LINQ
- 18. Colecciones Java convertir una cadena en una lista de caracteres
- 19. Estableciendo la propiedad Item de una Colección en VBA
- 20. ¿Dividir una colección en partes según la condición con LINQ?
- 21. MongoDB: Billetes de documentos en una colección
- 22. Cómo crear una colección paralela de Scala a partir de una colección de Java
- 23. ¿Inicializar una colección dentro de un objeto?
- 24. ¿Qué es @ en una propiedad de objeto?
- 25. Mongo sharding no puede dividir una gran colección entre fragmentos
- 26. java: devolver una colección
- 27. Obteniendo el objeto de una colección singleton
- 28. ¿Cómo escribir mi propio iterador para una propiedad de colección de una propiedad (con el tipo correcto de conversión)?
- 29. AddRange en una colección
- 30. Comparación de dos colecciones en Java
gracias esta solución me parece elegante. – james
+1 - para sangrar correctamente el código y agregar comentarios –