Gruppieren Sie eine Liste von Objekten nach einem Attribut

Lesezeit: 8 Minuten

Gruppieren Sie eine Liste von Objekten nach einem Attribut
Dilukshan Mahendra

Ich muss eine Liste von Objekten gruppieren (Student) mit einem Attribut (Location) des jeweiligen Objekts. Der Code ist wie folgt:

public class Grouping {
    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"));

    }
}

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

Bitte schlagen Sie mir einen sauberen Weg vor, dies zu tun.

  • Eine Hashmap mit dem Standort als Schlüssel und der Schülerliste als Wert.

    – Omoro

    10. Februar 14 um 13:26 Uhr

  • Würde die Sortierung nach Standort Ihr Problem lösen, oder gibt es noch etwas anderes?

    – Kriegsherren

    10. Februar 14 um 13:27 Uhr

  • Versuchen Sie es mit Comparator und sortieren Sie nach Standort.

    – pshemek

    10. Februar 14 um 13:28 Uhr

  • @Warlord Ja, aber ich gehe weiter, wenn ich Informationen wie die Anzahl der Schüler nach Standort benötige, besser, wenn ich sie gruppieren könnte

    – Dilukshan Mahendra

    10. Februar 14 um 13:28 Uhr

  • @Omoro Bitte können Sie mir einen Hinweis per Code geben, ich bin mit Hashmaps nicht so vertraut

    – Dilukshan Mahendra

    10. Februar 14 um 13:30 Uhr

Unter Java8:

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

  • Das liegt daran, dass Student Klasse stud_location ist als Freundlich angegeben. Nur Student class und jede Klasse, die im selben Paket von definiert ist Student kann Zugreifen stud_location. Wenn Sie setzen public String stud_location; anstatt String stud_location;, das sollte funktionieren. Oder Sie können eine Getter-Funktion definieren. Mehr Infos im cs.princeton.edu/courses/archive/spr96/cs333/java/tutorial/java/…

    – Eranga Heshan

    30. Dezember 18 um 14:19 Uhr

Gruppieren Sie eine Liste von Objekten nach einem Attribut
Dileep

Dadurch wird das Objekt studenten zu hinzugefügt HashMap mit locationID als Schlüssel.

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

Iterieren über diesen Code und fügen Sie Schüler hinzu HashMap:

if (!hashMap.containsKey(locationId)) {
    List<Student> list = new ArrayList<Student>();
    list.add(student);

    hashMap.put(locationId, list);
} else {
    hashMap.get(locationId).add(student);
}

Wenn Sie alle Schüler mit bestimmten Standortdetails möchten, können Sie dies verwenden:

hashMap.get(locationId);

Dadurch erhalten Sie alle Schüler mit derselben Standort-ID.

  • Sie haben eine List of Location-Objekte deklariert und in der nächsten Zeile fügen Sie der vorherigen Liste ein Student-Objekt hinzu, das einen Fehler ausgeben sollte.

    – OJVM

    6. Dezember 17 um 15:25 Uhr

  • hashMap.get() gibt null zurück, wenn hashMap.contanisKey() false zurückgibt. Sie könnten den Aufruf der Methode containsKey() speichern, wenn Sie zuerst hashMap.get() aufrufen, das Ergebnis in einer lokalen Variablen speichern und prüfen, ob diese lokale Variable null ist

    – Esteve

    18. Januar 18 um 9:45 Uhr


  • @Dileep danke für diesen einen Mann. Meinen Tag gerettet.

    – Sachawat Hossain

    11. August 21 um 8:30 Uhr

1644321549 692 Gruppieren Sie eine Liste von Objekten nach einem Attribut
Sampath challa

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

}

1644321549 930 Gruppieren Sie eine Liste von Objekten nach einem Attribut
Chirag

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

}

Das Ergebnis wird sein:

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

Gruppieren Sie eine Liste von Objekten nach einem Attribut
Shafin Mahmud

Java 8-GruppierungNach Collector

Wahrscheinlich ist es spät, aber ich möchte eine verbesserte Idee zu diesem Problem teilen. Dies ist im Grunde dasselbe wie die Antwort von @Vitalii Fedorenko, aber handlicher, um herumzuspielen.

Sie können einfach die verwenden Collectors.groupingBy() indem Sie die Gruppierungslogik als Funktionsparameter übergeben, erhalten Sie die geteilte Liste mit der Schlüsselparameterzuordnung. Beachten Sie, dass mit Optional wird verwendet, um die unerwünschte NPE zu vermeiden, wenn die bereitgestellte Liste vorhanden ist null

public static <E, K> Map<K, List<E>> groupBy(List<E> list, Function<E, K> keyFunction) {
    return Optional.ofNullable(list)
            .orElseGet(ArrayList::new)
            .stream()
            .collect(Collectors.groupingBy(keyFunction));
}

Jetzt kannst du gruppiere nach irgendwas damit. Für den Anwendungsfall hier in der Frage

Map<String, List<Student>> map = groupBy(studlist, Student::getLocation);

Vielleicht möchten Sie sich auch damit befassen Leitfaden zur Java 8-Gruppierung nach Collector

Sie können Folgendes verwenden:

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

//drucken

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

Implementieren Sie die SQL GROUP BY-Funktion in Java mit Comparator, der Comparator vergleicht Ihre Spaltendaten und sortiert sie. Grundsätzlich, wenn Sie sortierte Daten behalten, die als gruppierte Daten aussehen, wenn Sie beispielsweise dieselben wiederholten Spaltendaten haben, sortieren Sie sie mit dem Sortiermechanismus, wobei dieselben Daten auf einer Seite bleiben, und suchen Sie dann nach anderen Daten, bei denen es sich um unterschiedliche Daten handelt. Dies wird indirekt als GRUPPIERUNG gleicher Daten angesehen.

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

Die Ausgabe erfolgt hier für die obige ProductBean-Liste erfolgt nach GROUP BY-Kriterien, hier, wenn Sie die Eingabedaten sehen, die der Liste von ProductBean an Collections.sort (list, object of Comparator für Ihre erforderliche Spalte) gegeben werden. Dies wird basierend auf Ihrer Comparator-Implementierung sortiert und Sie können die GRUPPIERTEN Daten in der unteren Ausgabe sehen. Hoffe das hilft…

    ******** 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]

  • Hallo, bitte posten Sie nicht dieselbe Antwort mehrmals und posten Sie bitte keinen Rohcode ohne eine Erklärung, wie er funktioniert und wie er das Problem in der obigen Frage löst.

    – Matte

    17. November 14 um 4:28 Uhr

  • Tut mir leid, Kumpel, beim Einfügen des Codes ist ein Fehler aufgetreten, da er möglicherweise mehrfach geworden ist. Ich habe die Erklärung für das, was ich gepostet habe, bearbeitet. Hoffe das sieht jetzt gut aus???

    – Ravi Beli

    17. November 14 um 12:58 Uhr

  • Mir fehlt etwas oder dieser Code sortiert anstatt nach einem Feld zu gruppieren? Ich sehe Produkte sortiert nach ID, dann nach Preis

    – Geldgeber7

    3. Juli 2020 um 16:19 Uhr

.

822360cookie-checkGruppieren Sie eine Liste von Objekten nach einem Attribut

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy