Avatar billede flodhesten Nybegynder
23. september 2010 - 22:21 Der er 6 kommentarer og
1 løsning

Java Comparator

Hej eksperter.

Jeg arbejder for tiden med at forstå Comparable og Comparator.

Mit problem er, at jeg har en ArrayListe som indeholde nogle Objecter af typen "Artikel". Hver artikelobject har en titel, forfatter og en score.

Jeg skal have sorteret min ArrayList efter score og hvis score er ens, skal der sorteres efter titlen.

Såvidt jeg har forstået, så skal jeg gøre brug af Collections. Jeg havde tænkt mig at bruge Comparator, og jeg har derfor følgende kode:

public class Article implements Comparator<Article> {

    private String author;
    private String title;
    private int score;
   
    public int compare(Article a1, Article a2) {
      ???
    }
}


Forhåbentlig er der nogle der kan hjælpe mig lidt på vej.
Avatar billede arne_v Ekspert
23. september 2010 - 22:34 #1
Comparable er noget din data klasser implementerer for at definere en naturlig sortering.

Comparator er en anden klasse end din data klasse for at definere en mere usaedvanelig sortering.
Avatar billede arne_v Ekspert
23. september 2010 - 22:34 #2
Eksempel med Comparable:

public class Medarbejder implements Comparable<Medarbejder> {
    private int nr;
    private String navn;
    private String stilling;
    ...
    public int compareTo(Medarbejder m) {
        return navn.compareTo(m.navn);
    }
Avatar billede arne_v Ekspert
23. september 2010 - 22:39 #3
Eksempel med Comparator (som anonym klasse):

        Collections.sort(coll, new Comparator<String>() {
            public int compare(String s1, String s2) {
                return s1.compareTo(s2);
            }
        });
Avatar billede flodhesten Nybegynder
23. september 2010 - 22:44 #4
Arh, okay.

Men hvad så når jeg skal sortere mine objecter efter en int-værdi (score) og hvis der er flere objecter med samme score, så skal der sorteres efter en String-værdi (titel).

Er det så en naturlig eller usændvanlig sortering?

Her er noget at min kode jeg har forsøgt med:

_________________________


public class Article implements Comparable<Article> {

    private String author;
    private String title;
    private int score;
   
    public int compareTo(Article a) {
        return this.getScore() - a.getScore();
    }
}

______________________

Og en metode i en anden klasse:
______________________

public void printArticles() {
        Collections.sort(articles);
        for (Article a : articles) {
            System.out.println(a);
        }
    }

______________________


Det virker med hensyn til sortering efter score. Men jeg kan ikke helt lure hvordan jeg sorterer efter titel, hvis objecterne har samme score.
Avatar billede arne_v Ekspert
23. september 2010 - 22:54 #5
proev:

    public int compareTo(Article a) {
        if(this.getScore() == a.getScore()) {
            return this.getTitle().compareTo(a.getTitle());
        } else {
            return this.getScore() - a.getScore();
        }
    }
Avatar billede flodhesten Nybegynder
23. september 2010 - 23:02 #6
Nååå ja.

Det er egentlig ret simpelt.

Mange tak for hjælpen og udpenslingen. Det hjalp på forståelsen. Skriv et svar og du skal få point.
Avatar billede arne_v Ekspert
24. september 2010 - 00:23 #7
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester