Avatar billede jnh Nybegynder
16. oktober 2003 - 14:32 Der er 11 kommentarer og
1 løsning

Sortering af objekter i ArrayList

Hej!

Jeg har en ArrayList, som består af en række objekter.
Objekterne indeholder titel, art og forfatter.

Hvordan sorterer jeg ArrayList efter titel?

//Jesper
Avatar billede arne_v Ekspert
16. oktober 2003 - 14:35 #1
toArray og Arrays sort
Avatar billede soreno Praktikant
16. oktober 2003 - 14:37 #2
implementer Comparable interfacet i din dataopbevarings klasse (den med titel, art og forfatter) og kald:
Collections.sort(myArrayList);
Avatar billede arne_v Ekspert
16. oktober 2003 - 14:42 #3
Collections.sort havde jeg tilfældigvis et lill eeksmepel liggende på:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortArrayListComplex {
    public static void main(String[] args) {
        List lst = new ArrayList();
        lst.add(new Data("CCC","1"));
        lst.add(new Data("BB", "2"));
        lst.add(new Data("A", "3"));
        for(int i = 0; i < lst.size(); i++) {
            System.out.println((Data)lst.get(i));
        }
        Collections.sort(lst, new Cmp());
        for(int i = 0; i < lst.size(); i++) {
            System.out.println((Data)lst.get(i));
        }
    }
}

class Data {
    private String v1;
    private String v2;
    public Data(String v1, String v2) {
        this.v1 = v1;
        this.v2 = v2;
    }
    public String toString() {
        return (v1 + " " + v2);
    }
    public String getV1() {
        return v1;
    }
    public String getV2() {
        return v2;
    }

}

class Cmp implements Comparator {
    public int compare(Object o1, Object o2) {
        return ((Data)o1).getV1().compareTo(((Data)o2).getV1());
    }
    public boolean equals(Object obj)  {
        return false;
    }
}
Avatar billede arne_v Ekspert
16. oktober 2003 - 14:44 #4
Det var så med comparator i.s.f. med comparable interface.

Hvis Data klassen implementere Comparable behøver man ikke
nogen comparator.
Avatar billede arne_v Ekspert
16. oktober 2003 - 14:45 #5
Du bør iøvrigt afvise mit første svar, da den metode ikke er velegnet
til objekter men kun til simple data typer. Jeg have ikke lige tænkt
det hele igennem. Sorry.
Avatar billede jnh Nybegynder
16. oktober 2003 - 14:58 #6
Jeg er ret ny mht. java, så hvis i kan fortælle mig, hvad det er der foregår, ville jeg blive meget lykkelig!
- Jeg kan sagten bruge jeres svar, men det ville være sjovt at forstå dem også!

//Jesper
Avatar billede arne_v Ekspert
16. oktober 2003 - 15:03 #7
Mit eksmepel har en Data klasse med 2 felter V1 og V2 (det er bare en demo).

Og ved at lave en klasse en såkaldt comparator som kan sammenligne
2 objekter af typen Data, så man man få den sorteret med Collections.sort
metoden.
Avatar billede arne_v Ekspert
16. oktober 2003 - 15:07 #8
Samme eksemple med comparable:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortArrayListComplex {
    public static void main(String[] args) {
        List lst = new ArrayList();
        lst.add(new Data("CCC","1"));
        lst.add(new Data("BB", "2"));
        lst.add(new Data("A", "3"));
        for(int i = 0; i < lst.size(); i++) {
            System.out.println((Data)lst.get(i));
        }
        Collections.sort(lst);
        for(int i = 0; i < lst.size(); i++) {
            System.out.println((Data)lst.get(i));
        }
    }
}

class Data implements Comparable {
    private String v1;
    private String v2;
    public Data(String v1, String v2) {
        this.v1 = v1;
        this.v2 = v2;
    }
    public String toString() {
        return (v1 + " " + v2);
    }
    public String getV1() {
        return v1;
    }
    public String getV2() {
        return v2;
    }
    public int compareTo(Object o) {
        return v1.compareTo(((Data)o).getV1());
    }
}
Avatar billede arne_v Ekspert
16. oktober 2003 - 15:08 #9
Præcis samme logik men sammenligningen er bare flyttet ind i
Data klassen.
Avatar billede jnh Nybegynder
16. oktober 2003 - 15:13 #10
jeg forstår bare ikke hvorfor man laver den sammenligning... er det virkelig nødvendigt?

//Jesper
Avatar billede soreno Praktikant
16. oktober 2003 - 15:16 #11
Du er jo nødt til at have et kriterie for at kunne sortere.

Det er ikke nemt at sortere hvis ikke man definere hvad der skal sorteres efter. Default sorteres der (vist nok) efter objekternes placering i RAM - ikke særligt brugbart. Derfor skal man selv definere sit kriterie.

Ved simple datatyper (og klasser som implementerer Comparable interfacet - f.eks. String) er det ikke nødvendigt.
Avatar billede arne_v Ekspert
16. oktober 2003 - 15:20 #12
Når du har et "komplekst" objekt - altså et objekt med mere end 1 værdi - er
du nødt til at forklare eksplicit hvordan der skal sorteres.

Fordi det vil jo næppe give samme rækkefølge ved sortering efter
titel art og forfatter.
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