Csak akkor olvass tovább, ha a többszörös rendezés feladatot megoldottad, vagy nem sikerült megoldani.
Adott tehát egy Kutya osztály. Minden kutyáról 2 tulajdonságot tartunk nyilván. Ezt kellene előbb fajta, majd azonos fajta esetén életkor szerint rendezni.
A megoldás
A feladat megoldásakor kétszer rendezünk. Először az első tulajdonság szerint egy tetszőleges rendezési algoritmussal:
Kutya[] kutyak = { new Kutya("tacsko", 3), new Kutya("labrador", 7), new Kutya("labrador", 5), new Kutya("vizsla", 1), new Kutya("labrador", 2), new Kutya("vizsla", 3), new Kutya("labrador", 1), new Kutya("tacsko", 2) }; // első rendezés az első tulajdonság szerint (fajta) Kutya csere; for( int i = 0; i < kutyak.length-1; i++ ) { for( int j = i+1; j < kutyak.length; j++ ) { if( kutyak[i].getFajta().compareTo( kutyak[j].getFajta() ) > 0 ) { csere = kutyak[i]; kutyak[i] = kutyak[j]; kutyak[j] = csere; } } }
Ha ez megvan, akkor úgy rendezünk a második tulajdonság alapján, hogy az első tulajdonságokat már nem keverjük össze. A kiemelt sorban látható az a feltétel, mely biztosítja, hogy csak akkor vizsgáljuk meg a második tulajdonságot, ha az első tulajdonságuk megegyezik! Ha ez teljesül ÉS az életkor nem jó sorrendben áll, akkor cserélünk. Nagyon fontos a két feltétel vizsgálatának sorrendje!
// második rendezés a második tulajdonság esetén for( int i = 0; i < kutyak.length-1; i++ ) { for( int j = i+1; j < kutyak.length; j++ ) { if( kutyak[i].getFajta().equals( kutyak[j].getFajta() ) && kutyak[i].getKor() > kutyak[j].getKor() ) { csere = kutyak[i]; kutyak[i] = kutyak[j]; kutyak[j] = csere; } } } // kiíratás ellenőrzésképp, a sorrend valóban megfelelő for( Kutya k : kutyak ) { System.out.println( k.toString() ); }
A megoldás két ciklust igényel, ami azért lássuk be, nem túl hatékony. Lehet-e még optimalizálni, egyszerűsíteni rajta?
Olvasd el a a többszörös rendezés kiegészítő leckéjét, ha egyszerűbb megoldásokat szeretnél kapni.