IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Jak seřadit objekty v ArrayList podle proměné z objektu

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Lukáš S
Člen
Avatar
Lukáš S:6.4.2020 21:23

Ahoj potřeboval bych poradit. Jak seřadím ArrayList s objektama "Clovek" podle proměné "month" ve třídě? Je to zapišovač narozenin a chci ty údaje seřadit podle měsíce.

import java.util.ArrayList;

public class Main {

        public static void main(String[] args) {

                ArrayList<Clovek> lidi = new ArrayList<Clovek>();
                lidi.add(new Clovek("Petr",18,12,2000));   // jmeno,den,měsíc,rok
                lidi.add(new Clovek("Karel",01,02,1999));
                lidi.add(new Clovek("Adela",30,05,2002));
                lidi.add(new Clovek("Klara",05,11,2004));


        }

}

Třída:

public class Clovek  {
        private String name;
        private int day,month,year;

        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }


        public int getDen() {
                return day;
        }
        public int getMesic() {
                return month;
        }
        public int getRok() {
                return year;
        }

        public Clovek() {
        }

        public Clovek(String n,int d,int m,int y) {
                name = n;
                day = d;
                month = m;
                year = y;
        }

        public String toString() {
                return name+ " narozen/a "+ day+ ". "+ month+ " "+ year;
        }

}
Editováno 6.4.2020 21:24
 
Odpovědět
6.4.2020 21:23
Avatar
Odpovídá na Lukáš S
Matúš Olejník:6.4.2020 22:28

Ahoj, ArrayList poskytuje priamo metódu sort ktorej vstupom je nejaká anonymná trieda ktorá implementuje rozhranie Comparator a teda podľa tvojich pokynov zotriedi daný list.

Bez lambda výrazu by si teda ako parameter pre tú metódu sort poslal nejakú anonymnú triedu ktorá by implementovala to rozhranie Comparator, čo by vyzeralo takto

lidi.sort(new Comparator<Clovek>() {
    @Override
    public int compare(Clovek clovek1, Clovek clovek2) {
        if(clovek1.getMesic() == clovek2.getMesic()){
            return 0;
        }
        if(clovek1.getMesic() > clovek2.getMesic()){
            return 1;
        }
        return -1;
    }
});

S lambda výrazom sa môžeš zbaviť toho explicitného vytvárania triedy a overridu danej metódy. V krátkosti, nejaké tvoje názvy pre parametre metódy ktorú ideš implementovať dáš do zátvoriek potom dáš -> {a tu tvoju implementáciu}. Toto je naozaj len k tomuto príkladu lebo potom to môžeš viacej a viacej ešte zjednodušiť :D Takže by to vyzeralo nejako takto napr.

lidi.sort((clovek1, clovek2) -> {
    if(clovek1.getMesic() == clovek2.getMesic()){
        return 0;
    }
    if(clovek1.getMesic() > clovek2.getMesic()){
        return 1;
    }
    return -1;
});

Potom však zistíš že tie ifovačky už ti ponúka trieda Integer v metóde compare tak to zmeníš na

lidi.sort((clovek1, clovek2) -> {
    return Integer.compare(clovek1.getMesic(), clovek2.getMesic());
});

A nakoniec zistíš že celú túto triedu ktorú si vytváral a hovoril jej podľa čoho má daný List sortovať už ti ponúka trieda Comparator v metóde comparingInt ktorej len povieš aký údaj má porovnávať.
Po tomto všetkom, plus ešte ak si niečo nájdeš o lambdách v jave, to osekáš na jeden riadok :D

lidi.sort(Comparator.comparingInt(Clovek::getMesic));
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
6.4.2020 22:28
/* I am not sure why this works but it fixes the problem */
Avatar
Alesh
Tvůrce
Avatar
Alesh:6.4.2020 22:35

V hlavní třídě přidáš metodu na seřazení (+ import java.util.Collec­tions):

Collections.sort(lidi);

Ve třídě osoby pak musíš 1) implementovat rozhraní Comparable

class Clovek implements Comparable<Clovek> {

a pak 2) překrýt metodu toCompare

@Override
public int compareTo(Clovek clovek) {
    return this.month - clovek.month;
}

Jinak je samozřejmě ptákovina uchovávat datum narození jako 3 inty, místo toho použij proměnnou typu LocalDate.

 
Nahoru Odpovědět
6.4.2020 22:35
Avatar
Lukáš S
Člen
Avatar
Odpovídá na Matúš Olejník
Lukáš S:6.4.2020 22:51

Děkuju za pomoc

 
Nahoru Odpovědět
6.4.2020 22:51
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.