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.
