por ordenar objetos metodos listas lista atributo array alfabeticamente java list grouping

objetos - ordenar arraylist java por atributo



Agrupe una lista de objetos por un atributo: Java (10)

Necesito agrupar una lista de objetos (Estudiante) usando un atributo (Ubicación) del objeto particular, el código es como a continuación,

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; } }

Por favor sugiérame una manera limpia de hacerlo.


En Java 8:

Map<String, List<Student>> studlistGrouped = studlist.stream().collect(Collectors.groupingBy(w -> w.stud_location));


Esto agregará el objeto de los estudiantes a HashMap con HashMap de locationID como clave.

HashMap<Integer, List<Location>> hashMap = new HashMap<Integer, List<Location>>();

Iteramos este código y agregamos estudiantes al HashMap :

if (!hashMap.containsKey(locationId)) { List<Location> list = new ArrayList<Location>(); list.add(student); hashMap.put(locationId, list); } else { hashMap.get(locationId).add(student); }

Si desea que todos los estudiantes con detalles de ubicación particulares, puede utilizar esto:

hashMap.get(locationId);

que le dará a todos los estudiantes con la misma ID de ubicación.


Implementar SQL GROUP BY Feature en Java usando Comparator, el comparador 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, entonces clasifique los mecanismos clasificándolos manteniendo los mismos datos por un lado y luego busque otros datos que no sean similares. Esto indirectamente visto como AGRUPACIÓN de los mismos datos.

public class GroupByFeatureInJava { public static void main(String[] args) { ProductBean p1 = new ProductBean("P1", 20, new Date()); ProductBean p2 = new ProductBean("P1", 30, new Date()); ProductBean p3 = new ProductBean("P2", 20, new Date()); ProductBean p4 = new ProductBean("P1", 20, new Date()); ProductBean p5 = new ProductBean("P3", 60, new Date()); ProductBean p6 = new ProductBean("P1", 20, new Date()); List<ProductBean> list = new ArrayList<ProductBean>(); list.add(p1); list.add(p2); list.add(p3); list.add(p4); list.add(p5); list.add(p6); for (Iterator iterator = list.iterator(); iterator.hasNext();) { ProductBean bean = (ProductBean) iterator.next(); System.out.println(bean); } System.out.println("******** AFTER GROUP BY PRODUCT_ID ******"); Collections.sort(list, new ProductBean().new CompareByProductID()); for (Iterator iterator = list.iterator(); iterator.hasNext();) { ProductBean bean = (ProductBean) iterator.next(); System.out.println(bean); } System.out.println("******** AFTER GROUP BY PRICE ******"); Collections.sort(list, new ProductBean().new CompareByProductPrice()); for (Iterator iterator = list.iterator(); iterator.hasNext();) { ProductBean bean = (ProductBean) iterator.next(); System.out.println(bean); } } } class ProductBean { String productId; int price; Date date; @Override public String toString() { return "ProductBean [" + productId + " " + price + " " + date + "]"; } ProductBean() { } ProductBean(String productId, int price, Date date) { this.productId = productId; this.price = price; this.date = date; } class CompareByProductID implements Comparator<ProductBean> { public int compare(ProductBean p1, ProductBean p2) { if (p1.productId.compareTo(p2.productId) > 0) { return 1; } if (p1.productId.compareTo(p2.productId) < 0) { return -1; } // at this point all a.b,c,d are equal... so return "equal" return 0; } @Override public boolean equals(Object obj) { // TODO Auto-generated method stub return super.equals(obj); } } class CompareByProductPrice implements Comparator<ProductBean> { @Override public int compare(ProductBean p1, ProductBean p2) { // this mean the first column is tied in thee two rows if (p1.price > p2.price) { return 1; } if (p1.price < p2.price) { return -1; } return 0; } public boolean equals(Object obj) { // TODO Auto-generated method stub return super.equals(obj); } } class CompareByCreateDate implements Comparator<ProductBean> { @Override public int compare(ProductBean p1, ProductBean p2) { if (p1.date.after(p2.date)) { return 1; } if (p1.date.before(p2.date)) { return -1; } return 0; } @Override public boolean equals(Object obj) { // TODO Auto-generated method stub return super.equals(obj); } } }

La salida está aquí para la lista de ProductBean anterior se hace criterios GROUP BY, aquí si ve los datos de entrada que se da la lista de ProductBean a Collections.sort (lista, objeto de Comparator para la columna requerida) Esto ordenará en función de la implementación de su comparador y podrá ver los datos AGRUPADOS en la salida siguiente. Espero que esto ayude...

******** BEFORE GROUPING INPUT DATA LOOKS THIS WAY ****** ProductBean [P1 20 Mon Nov 17 09:31:01 IST 2014] ProductBean [P1 30 Mon Nov 17 09:31:01 IST 2014] ProductBean [P2 20 Mon Nov 17 09:31:01 IST 2014] ProductBean [P1 20 Mon Nov 17 09:31:01 IST 2014] ProductBean [P3 60 Mon Nov 17 09:31:01 IST 2014] ProductBean [P1 20 Mon Nov 17 09:31:01 IST 2014] ******** AFTER GROUP BY PRODUCT_ID ****** ProductBean [P1 20 Mon Nov 17 09:31:01 IST 2014] ProductBean [P1 30 Mon Nov 17 09:31:01 IST 2014] ProductBean [P1 20 Mon Nov 17 09:31:01 IST 2014] ProductBean [P1 20 Mon Nov 17 09:31:01 IST 2014] ProductBean [P2 20 Mon Nov 17 09:31:01 IST 2014] ProductBean [P3 60 Mon Nov 17 09:31:01 IST 2014] ******** AFTER GROUP BY PRICE ****** ProductBean [P1 20 Mon Nov 17 09:31:01 IST 2014] ProductBean [P1 20 Mon Nov 17 09:31:01 IST 2014] ProductBean [P2 20 Mon Nov 17 09:31:01 IST 2014] ProductBean [P1 20 Mon Nov 17 09:31:01 IST 2014] ProductBean [P1 30 Mon Nov 17 09:31:01 IST 2014] ProductBean [P3 60 Mon Nov 17 09:31:01 IST 2014]


Podrías hacer esto:

Map<String, List<Student>> map = new HashMap<String, List<Student>>(); List<Student> studlist = new ArrayList<Student>(); studlist.add(new Student("1726", "John", "New York")); map.put("New York", studlist);

las claves serán ubicaciones y la lista de valores de los estudiantes. Luego, puedes obtener un grupo de estudiantes simplemente usando:

studlist = map.get("New York");


Puedes ordenar de esta manera:

Collections.sort(studlist, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o1.getStud_location().compareTo(o2.getStud_location()); } });

Suponiendo que también tiene el getter para ubicación en su clase de Estudiante.


Puedes usar lo siguiente:

Map<String, List<Student>> groupedStudents = new HashMap<String, List<Student>>(); for (Student student: studlist) { String key = student.stud_location; if (groupedStudents.get(key) == null) { groupedStudents.put(key, new ArrayList<Student>()); } groupedStudents.get(key).add(student); }

//impresión

Set<String> groupedStudentsKeySet = groupedCustomer.keySet(); for (String location: groupedStudentsKeySet) { List<Student> stdnts = groupedStudents.get(location); for (Student student : stdnts) { System.out.println("ID : "+student.stud_id+"/t"+"Name : "+student.stud_name+"/t"+"Location : "+student.stud_location); } }


Usando Java 8

import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; class Student { String stud_id; String stud_name; String stud_location; public String getStud_id() { return stud_id; } public String getStud_name() { return stud_name; } public String getStud_location() { return stud_location; } Student(String sid, String sname, String slocation) { this.stud_id = sid; this.stud_name = sname; this.stud_location = slocation; } } class Temp { public static void main(String args[]) { Stream<Student> studs = Stream.of(new Student("1726", "John", "New York"), new Student("4321", "Max", "California"), new Student("2234", "Max", "Los Angeles"), new Student("7765", "Sam", "California")); Map<String, Map<Object, List<Student>>> map= studs.collect(Collectors.groupingBy(Student::getStud_name,Collectors.groupingBy(Student::getStud_location))); System.out.println(map);//print by name and then location } }

El resultado será:

{ Max={ Los Angeles=[Student@214c265e], California=[Student@448139f0] }, John={ New York=[Student@7cca494b] }, Sam={ California=[Student@7ba4f24f] } }


puedes usar Multimaps guava

@Canonical class Persion { String name Integer age } List<Persion> list = [ new Persion("qianzi", 100), new Persion("qianzi", 99), new Persion("zhijia", 99) ] println Multimaps.index(list, { Persion p -> return p.name })

imprime:

[qianzi: [com.ctcf.message.Persion (qianzi, 100), com.ctcf.message.Persion (qianzi, 88)], zhijia: [com.ctcf.message.Persion (zhijia, 99)]]


Function<Student, List<Object>> compositKey = std -> Arrays.asList(std.stud_location()); studentList.stream().collect(Collectors.groupingBy(compositKey, Collectors.toList()));

Si desea agregar varios objetos para el grupo, puede simplemente agregar el objeto en el método compositKey separándolo por una coma:

Function<Student, List<Object>> compositKey = std -> Arrays.asList(std.stud_location(),std.stud_name()); studentList.stream().collect(Collectors.groupingBy(compositKey, Collectors.toList()));


Map<String, List<Student>> map = new HashMap<String, List<Student>>(); for (Student student : studlist) { String key = student.stud_location; if(map.containsKey(key)){ List<Student> list = map.get(key); list.add(student); }else{ List<Student> list = new ArrayList<Student>(); list.add(student); map.put(key, list); } }