Triedenie objektov pomocou Collections

Programovacie jazyky, rady, poradňa...
pitbullko
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 294
Registrovaný: 13 nov 2009, 8:19
Bydlisko: „Keby som bol postavený pred rozhodnutie medzi zbabelosťou a násilím, zvolil by som násilie“[Gandhi]

Triedenie objektov pomocou Collections

Príspevok od používateľa pitbullko »

Ahojte, potreboval by som pomôcť s jednou úlohou.
Mám objekt, ktorý obsahuje ArrayList objektov typu osoba.
Tento ArrayList by som potreboval usporiadať podľa priezvisk osôb.
Robím to pomocou interface Comparable. ArrayList som previedol na List. Problém mám ten, že neviem ako zapísať metódu compareTo aby to fungovalo. Skúšal som už všetko možné ale vždy nejaký error.
Díky

Kód: Vybrať všetko

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Kolekcie implements Comparable<Osoba> {

    ArrayList<Osoba> zozCestujucich = new ArrayList();

    public void urobRezervaciu(String meno, String priezv, int vek){
        this.zozCestujucich.add(new Osoba(meno, priezv, vek));
    }

    public void getZoznamCestujucich(){
        Osoba pom;
        for(int i=0; i<this.zozCestujucich.size(); i++){
            pom = this.zozCestujucich.get(i);
            pom.getInfo();
        }
    }

    public int compareTo(Osoba o) {
        
    }

    public static void main(String[] args) {
        Kolekcie test = new Kolekcie();
        test.urobRezervaciu("Robert", "Fico", 35);
        test.urobRezervaciu("Mikulas", "Dzurinda", 40);
        test.urobRezervaciu("Robert", "Kalinak", 45);
        test.urobRezervaciu("Daniel", "Lipsic", 50);
        test.urobRezervaciu("Vladimir", "Meciar", 55);
        test.urobRezervaciu("Jan", "Slota", 60);
        test.urobRezervaciu("Pavol", "Hrusovsky", 65);
        test.urobRezervaciu("Viera", "Tomanova", 70);
        List list = Arrays.asList(test.zozCestujucich);
        Collections.sort(list);
        test.getZoznamCestujucich();
    }
}

Kód: Vybrať všetko

public class Osoba {
    String meno;
    String priezv;
    int vek;

    public Osoba(String meno, String priezv, int vek){
        this.meno=meno;
        this.priezv=priezv;
        this.vek=vek;
    }

    public void getInfo(){
        System.out.println(this.meno+" "+this.priezv+" "+this.vek);
    }
}
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: Triedenie objektov pomocou Collections

Príspevok od používateľa metthal »

S Javou ja zrovna nepracujem, ale podla toho co som si precital tu: http://download.oracle.com/javase/1.5.0 ... rable.html tak metoda compareTo() vrati zapornu hodnotu ak je to mensie, 0 ak je rovne a kladnu ak je vacsie. Ty kedze potrebujes porovnavat priezviska, tak musis nejakym sposobom porovnavat stringy. To ako, ti uz neprezradim, kedze sa nevyznam v Jave vobec. Ale myslim ze praca so Stringami je nieco zakladne, co musis ovladat ak s tym jazykom pracujes. Tak dufam ze aspon niecim som pomohol.
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

Re: Triedenie objektov pomocou Collections

Príspevok od používateľa mirak2 »

cele zle. idem to prekopat v eclipse a pastnem ti to sem aj s patricnym komentarom...

trieda Osoba by aj mohla zostat, akurat ti nasmerujem ako sa to zvykne robit - prekryjes toString (vsetky objekty by mali mat toString metody na vypis) a vratis string ktory si predtym vypisoval (opakujem, toto nie je nutne, nema to na nic vplyv ale takto sa to zvykne robit):

Kód: Vybrať všetko

public class Osoba {
    String meno;
    String priezv;
    int vek;

    public Osoba(String meno, String priezv, int vek){
        this.meno=meno;
        this.priezv=priezv;
        this.vek=vek;
    }

    public String toString(){
        return this.meno+" "+this.priezv+" "+this.vek;
    }
}
tu je toho viac...v prvom rade nebudes implementovat komparator tu..nebudes inicializovat instancnu premennu List mimo metody...getzoznam som premenoval lebo typicky getzoznam ti ma vratit zoznam a to robi nieco ine, je to detail, ale nie je v tom bordel...a vypis je cez foreach, v principe to robi to iste ako ked vo fore vzdy priradis do Osoby pom zoznam.get(i), skracuje to kod...tie "this." co si mal pred kazdou metodou som ti povyhadzoval, netreba ich...az v maine si inicializujes List tak ze do neho napchas arraylist (List je Interface, arraylist je jeho implementaciou, ak budes mat arraylist miesto listu nic nepokazis, ale zase, takto sa to robi, casom zistis preco)...napchas si osoby do zoznamu, blablabla a ides sortovat kolekciu zoznam podla komparatora, ktory najdes nizsie...a vypis. cela veda

Kód: Vybrať všetko

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Kolekcie{

    List<Osoba> zozCestujucich;

    public void urobRezervaciu(String meno, String priezv, int vek){
        zozCestujucich.add(new Osoba(meno, priezv, vek));
    }

    public void vypisZoznamCestujucich(){
        for (Osoba osoba : zozCestujucich) {
			System.out.println(osoba.toString());
		}
    }

    public static void main(String[] args) {
        Kolekcie test = new Kolekcie();
        test.zozCestujucich=new ArrayList<Osoba>();
        test.urobRezervaciu("Robert", "Fico", 35);
        test.urobRezervaciu("Mikulas", "Dzurinda", 40);
        test.urobRezervaciu("Robert", "Kalinak", 45);
        test.urobRezervaciu("Daniel", "Lipsic", 50);
        test.urobRezervaciu("Vladimir", "Meciar", 55);
        test.urobRezervaciu("Jan", "Slota", 60);
        test.urobRezervaciu("Pavol", "Hrusovsky", 65);
        test.urobRezervaciu("Viera", "Tomanova", 70);
        Collections.sort(test.zozCestujucich, new KomparatorOsob());
        test.vypisZoznamCestujucich();
    }
}
comparator je interface ktory ma jednu metodu...v nej porovnas priezviska osob...ak prve je skor v abecede vrati 1 (ze pri tomto porovnavani je skorsia o1), ak druhe -1, ak su rovnake tak 0, ziadna velka veda...

Kód: Vybrať všetko

import java.util.Comparator;

public class KomparatorOsob implements Comparator<Osoba> {

	@Override
	public int compare(Osoba o1, Osoba o2) {
		if(o1.priezv.compareTo(o2.priezv)>0) {
			return 1;
		} else if(o1.priezv.compareTo(o2.priezv)<0) {
			return -1;
		} else {
			return 0;
		}
	}
}
otazky?
javatar
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6112
Registrovaný: 12 aug 2010, 14:49
Bydlisko: I don't exist at all.

Re: Triedenie objektov pomocou Collections

Príspevok od používateľa javatar »

robis blbost - ty nemas implementovat comparable na klasu kolekcie ale na triedu osoba - nasledne by uz arraylist mohol mat metodu sort - ak nema (pisem z fleku) previest na pole osob a to sa uz cez utils.Arrays potriedit da

chapeme sa?
pitbullko
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 294
Registrovaný: 13 nov 2009, 8:19
Bydlisko: „Keby som bol postavený pred rozhodnutie medzi zbabelosťou a násilím, zvolil by som násilie“[Gandhi]

Re: Triedenie objektov pomocou Collections

Príspevok od používateľa pitbullko »

mirak2 vďaka za vyčerpávajúcu odpoveď :shock:, máš K+, vďaka aj ostatným. Otázky budú určite, len najskôr to idem trocha pozrieť lebo vidím, že od toho môjho riešenia je to dosť vzdialené :) ...
Napísať odpoveď