Necesito agrupar una lista de objetos (Estudiante) usando un atributo (Ubicación) del objeto en particular, el código es el siguiente,
public class Grouping {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
List<Student> studlist = new ArrayList<Student>();
studlist.add(new Student("1726", "John", "New York"));
studlist.add(new Student("4321", "Max", "California"));
studlist.add(new Student("2234", "Andrew", "Los Angeles"));
studlist.add(new Student("5223", "Michael", "New York"));
studlist.add(new Student("7765", "Sam", "California"));
studlist.add(new Student("3442", "Mark", "New York"));
//Code to group students by location
/* Output should be Like below
ID : 1726 Name : John Location : New York
ID : 5223 Name : Michael Location : New York
ID : 4321 Name : Max Location : California
ID : 7765 Name : Sam Location : California
*/
for (Student student : studlist) {
System.out.println("ID : "+student.stud_id+"\t"+"Name : "+student.stud_name+"\t"+"Location : "+student.stud_location);
}
}
}
class Student {
String stud_id;
String stud_name;
String stud_location;
Student(String sid, String sname, String slocation) {
this.stud_id = sid;
this.stud_name = sname;
this.stud_location = slocation;
}
}
Sugiéreme una forma limpia de hacerlo.
Respuestas:
Esto agregará el objeto de los estudiantes a la clave
HashMap
withlocationID
as.Repita este código y agregue estudiantes a
HashMap
:Si desea que todos los estudiantes tengan detalles de ubicación particulares, puede usar esto:
que le dará a todos los estudiantes con el mismo ID de ubicación.
fuente
En Java 8:
fuente
Student
clasestud_location
se especifica como Amistoso. Solo puede acceder laStudent
clase y cualquier clase que esté definida en el mismo paquete de . Si pones en lugar de , esto debería funcionar. O puede definir una función getter. Más información en cs.princeton.edu/courses/archive/spr96/cs333/java/tutorial/java/…Student
stud_location
public String stud_location;
String stud_location;
fuente
Usando Java 8
El resultado será:
fuente
Agrupación de Java 8 por colector
Probablemente sea tarde, pero me gusta compartir una idea mejorada sobre este problema. Esta es básicamente la misma respuesta de @Vitalii Fedorenko, pero es más fácil de jugar.
Puede usar simplemente
Collectors.groupingBy()
pasando la lógica de agrupación como parámetro de función y obtendrá la lista dividida con la asignación de parámetros clave. Tenga en cuenta que el usoOptional
se utiliza para evitar la NPE no deseada cuando la lista proporcionada esnull
Ahora puede agrupar por cualquier cosa con esto. Para el caso de uso aquí en la pregunta
Map<String, List<Student>> map = groupBy(studlist, Student::getLocation);
Tal vez le gustaría consultar también esta Guía para la agrupación de Java 8By Collector
fuente
Puede utilizar lo siguiente:
//impresión
fuente
Implemente SQL GROUP BY Feature en Java usando Comparator, comparator comparará los datos de su columna y los ordenará. Básicamente, si mantiene los datos ordenados que se ven como datos agrupados, por ejemplo, si tiene los mismos datos de columna repetidos, el mecanismo de clasificación los clasifica manteniendo los mismos datos en un lado y luego busca otros datos que sean datos diferentes. Esto se ve indirectamente como AGRUPACIÓN de los mismos datos.
La salida está aquí para la lista de ProductBean anterior se hace con los criterios de GROUP BY, aquí si ve los datos de entrada que se le da la lista de ProductBean a Collections.sort (lista, objeto de Comparator para su columna requerida) Esto se ordenará según la implementación de su comparador y podrá ver los datos AGRUPADOS en la siguiente salida. Espero que esto ayude...
fuente
Puedes ordenar así:
Suponiendo que también tenga el captador de ubicación en su clase de Estudiante.
fuente
Podrías hacer esto:
las claves serán las ubicaciones y la lista de valores de los estudiantes. Entonces, más tarde, puede obtener un grupo de estudiantes simplemente usando:
fuente
puedes usar
guava
'sMultimaps
imprime:
fuente
Si desea agregar varios objetos para agrupar, simplemente puede agregar el objeto en el
compositKey
método separándolo por una coma:fuente
fuente