Java egyperces – Többszörös rendezés megoldása

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.

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

*

Ez az oldal az Akismet szolgáltatást használja a spam csökkentésére. Ismerje meg a hozzászólás adatainak feldolgozását .