» »

[Java] Urejanje objektov v tabeli po več atributih

[Java] Urejanje objektov v tabeli po več atributih

SkIDiver ::

Imam recimo tabelo katera ima v vsakem polju en objekt. Objekt pa vsebuje več atributov, ki so različnih tipov.

Primer: Objekt Oseba1 ima atribute; Miha Kovac 26 let. Sedaj imam še en objekt Oseba2 z atributi; Janez Kovac 25 let. Sedaj pa zelim ta dva objekta urediti padajoce ali narascujoce. Recimo, da urejam naraščujoče po priimku, ki je pri obeh objektih drugi atribut. Zadeva se posortira ampak ne ravno najbolje. Prvi bo namreč izpisan Miha Kovac 26 let in drugi Janez Kovac 25 let kar je napačno zamoje sortirne zahteve. Sortiranje po priimku sicer štima ampak sedajbi želel, da zadeva posortira še po atributu ki sledi, ali pa po atributu pred priimkom torej imenom. Kako bi to storil? Stvar bi rad imel prioritetno. V mojem primeru zahtevam sortiranje po priimku. Nato pa bi se zadeva uredila še po vrstnem redu po imenu in starosti. Torej primarno se uredi po priimku nato pa še po atributu, ki je prioritetno vnaprej določen vendar tu ne zanemari ureditve po priimku!

kopernik ::

Tabelo ? Misliš Hashtable ? Ali polje ?

No, kakorkoli. Urejanje dosežeš z Arrays.sort ali Collections.sort. Pogoje za urejanje pa določiš kar na objektih z vmesnikom Comparable. Evo primerček :

class Oseba implements Comparable {
  private String ime;
  private String priimek;
  private int starost;

  public Oseba(String ime, String priimek, int starost) { 
    this.ime = ime;
    this.priimek = priimek;
    this.starost = starost;
  }

  //vrne 0, ce sta objekta enaka;
  //>0, ce je ta objekt vecji od drugega
  //<0, ce je ta objekt manjsi od drugega
  public int compareTo(Object o) {
    if(o instanceof Oseba) {
      Oseba other = (Oseba) o;
      //sortiramo najprej po starosti, nato po priimku, nato po imenu
      if(other.starost == this. starost) {
        int i = other.priimek.compareTo(this.priimek);
        if(i == 0) {
          return other.ime.compareTo(this.ime);
        } else {
          return i;
        }
      } else {
        return other.starost - this.starost;
      }
    } else {
      throw new IllegalArgumentException(
          "Object 'o' is of wrong type :" + o.getClass().getName());
    }
  }

  public boolean equals(Object o) {
    if(o instanceof Oseba) {
      Oseba other = (Oseba) o;
      return 
          (other.starost == this. starost) &&
          other.priimek.equals(this.priimek) &&
          other.ime.equals(this.ime);
    } else {
      throw new IllegalArgumentException(
          "Object 'o' is of wrong type :" + o.getClass().getName());
    }
  }
 
  public int hashCode() {
    return (this.priimek + this.ime + this.starost).hashCode();
  }
}


Override metod equals in hashcode je dobro vedno narediti, še posebej, če objekte uporabljaš kot ključe v hahshmapi.

kopernik ::

Še to ... če objektov ne moreš popravljati, implementiraj vmesnik Comparator, ki ga lahko nato poturiš raznim sortirnim metodam.

ČE želiš pravo sortiranje (glede na slovenski jezik ... vsak jezik ima namreč svoja pravila za sortiranje) pa uporabi razred Collator oz. RuleBasedCollator (podaš mu pravila za sortiranje).

Zgodovina sprememb…

  • spremenil: kopernik ()

SkIDiver ::

Va hudu. Bom se zadeve lotil jutri zjutraj! Hvala!

Sortirat pa moram polja oz arrays.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C#] Delo z okni - urejanje osebe

Oddelek: Programiranje
8984 (856) darkolord
»

[C#] Deserializacija

Oddelek: Programiranje
181860 (1463) Cvenemir
»

Povezani seznam

Oddelek: Programiranje
132094 (1691) pohano
»

[Java] Sortiranje objektov

Oddelek: Programiranje
192847 (2847) tjaz24
»

[Java][Naloga] Seznam študentov, majčken problem

Oddelek: Programiranje
362315 (2002) VASkO

Več podobnih tem