Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
et bud kunne måske være public int compareTo(SomeObject otherObject){ if(this.intValue < otherObject.getIntValue()) return -1; else if(this.intValue == otherObject.getIntValue()) return 0; else return 1; }
Det er ihvertfald en måde at løse problemstillingen på.
Dette giver bare det problem at denne metode indikerer at de objekter er ens hvis der returneres 0. Dette vil måske ikke være tilfældet hvis der er flere variable i objekterne der til sammen giver et unikt objekt.
Alternativt kunne man implementere public boolean lessThan(SomeObject otherObject) og public boolean greaterThan(SomeObject otherObject)
Så vil man ikke kunne indikere at de to objekter er ens, bare fordi at den ene variabel er den samme.
Du har nu ret i én ting, lb, nemlig at min compareTo() er dum. Den bør nemlig kun returnere 0 når er tilsvarende equals() giver true. Egentlig bør man bruge den version af java.util.Arrays.sort(), der tager en sammenligningsfunktion med som parameter.
Det er vel lige meget ved en sortering på et bestemt felt. Hvis flere objekter indeholder samme værdi, kan man ikke afgøre hvem der kommer først. Så må man sortere på et ekstra felt.
Jo, stigc, for equals og compareTo skal jo formentlig bruges i anden sammenhæng, hashtabeller fx. Derfor er mit arkæologiske gravearbejde i princippet spildt. Jeg må have lavet den løsning for at afteste et eller andet ...
Der bør laves en Comparator, som lb siger - men jeg kan ikke liiige finde et eksempel. Men vi kan jo lave det, hvis spørgeren vil ha\' det.
erik >> Der vil din metode i dit eksempel være fint at implementere i en AgeComparator. Der må den jo godt returnere 0, da det giver mening fordi denne Comparator netop vil have til formåle at undersøge disse to felter i to objekter.
Der behøver da ikke leveres kode til alt, der skal da også være mulighed for at folk selv kan være lidt kreative:)
Nu er da i denne diskussion blevet afsløret at der findes java.util.Arrays, og java.util.Comparator
public static class Person { public String navn; public int alder;
public Person(String navn, int alder) { this.navn=navn; this.alder=alder; }
public String toString() { return navn+\" \"+alder; } };
public static class AgeComparator implements java.util.Comparator { public int compare(Object p,Object q) { return ((Person)p).alder-((Person)q).alder; } };
stigc>> Arrays sorterer små mængder (<7) med insertion sort, og større mængder (>=7) med quicksort. Store arrays (>40) deles i ni bidder, som sorteres med quicksort, og merges (fra mergesort) bagefter. Det er algoritmerne i 1.3
Collections.sort bruger samme algoritme (idet de bare kalder toArray på en collection, sorterer arrayet og propper elementerne tilbage igen)
erikjacobsen>> Til hashing har du bare brug for hashCode og equals, men de skal til gengæld også være korrekte. Problemerne opstår i SortedSet og SortedMap definitioner, fordi de har en noget tung kontrakt.
Læser man API på Comparable, siger den: It is strongly recommended (though not required) that natural orderings be consistent with equals Altså at (a.compareTo(b)==0) == a.equals(b) og alle Comparable klasser i java er da også ok i den sammenhæng.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.