Avatar billede pigegruppe Nybegynder
08. juni 2003 - 15:37 Der er 18 kommentarer

Sortering på liste

Hej :o)

Er i gang med at lave et medlemsregister. Man kan via en GUI indtaste et navn, som efterfølgende kommer på en liste. Denne liste kunne jeg godt tænke mig bliver sorteret alfabetisk, men kan ikke rigtig få det til at lykkes... Er der mon nogle der kan hjælpe??

Koden her gør at et medlem kommer frem på selve listen...

Mvh. Nina

/**
    * denne metode opdaterer oplysningerne i registeret
    * og viser et medlems navn på en liste
    */

    public void opdaterListe() {

        Vector output = new Vector();
        String o;
        hmListIndexCpr = new HashMap(register.medlemListe.size());

        for (int i = 0; i < register.medlemListe.size(); i++) {
            Medlem m = (Medlem) register.medlemListe.get(i);
            o = m.getNavn() + "\n ";
            output.add(o);
            hmListIndexCpr.put(new Integer(i), new Integer(a.getCprNr()));
        }

        list.setListData(output);

    }

    public void opdater() {
        opdaterListe();

    }
Avatar billede riversen Nybegynder
08. juni 2003 - 15:42 #1
Du kan bruge Arrays.sort( Object[] a, Comparator c ). Du skal så lave en Comparator til formålet, som går ind og sammenligner navnene i dine medlems-objekter. Se evt. også Comparable interfacet.
Avatar billede arne_v Ekspert
08. juni 2003 - 15:50 #2
I kan sortere jeres Vector med noget ligende den her:

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

public class SortVectorComplex {
    public static void main(String[] args) {
        List lst = new Vector();
        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;
    }
}

Hvor Data så skal erstattes af jeres Medlem.
Avatar billede riversen Nybegynder
08. juni 2003 - 15:53 #3
pigegruppe: hvad er problemet?
Avatar billede pigegruppe Nybegynder
08. juni 2003 - 15:53 #4
Jeg har tidligere prøvet at lave en comparator der så ud som nedenstående, men jeg tror stadig jeg mangler noget

import java.util.Comparator;

public class TitelComparator implements Comparator {

   
    public int compare(Object arg0, Object arg1) {
        Titel t1 = (Titel) arg0;
        Titel t2 = (Titel) arg1;
        return t1.getTitel().compareTo(t2.getTitel());
    }

}
Avatar billede pigegruppe Nybegynder
08. juni 2003 - 15:55 #5
Til Arne V...
Tak for forslaget, men problemet er at der hvor du skriver
lst.add(new Data("CCC","1"));
der har jeg ikke noget jeg som sådan skiver ind i selve koden... altså navne. Jeg skriver navnene i et felt i en GUI, og derefter kommer det på listen
Avatar billede riversen Nybegynder
08. juni 2003 - 15:56 #6
= er et assignment så du må have brugt ==...hvilket sammenligner adressen i hukommelsen og ikke indholdet af Titel. Titel bør implementere comparable
Avatar billede arne_v Ekspert
08. juni 2003 - 15:57 #7
Den ser ellers rigtig ud.

Hvis I laver en tilsvarende for Medlem, så bør
Collections.sort kunne bruges.
Avatar billede riversen Nybegynder
08. juni 2003 - 15:57 #8
sorry...glemt lige hvad jeg skrev det...det burde være ok det du har prøvet der. Hvad var problemet?
Avatar billede pigegruppe Nybegynder
08. juni 2003 - 15:58 #9
Problemet er at det jeg gerne vil have den til at gøre er at hver gang jeg opretter et nyt medlem fra min gui, vil jeg gerne have, at navnet som kommer på min liste bliver automatisk bliver sorteret alfabetisk
Avatar billede arne_v Ekspert
08. juni 2003 - 15:58 #10
Den eneste linie i main I skal kigge på er:

Collections.sort(lst, new Cmp());

resten er bare for at få nogle test data ind og for at skrive data ud
bagefter så man kan ese at de er sorteret.
Avatar billede riversen Nybegynder
08. juni 2003 - 15:58 #11
ja, og hvis du gøre ligesom med titel skulle dette være løst
Avatar billede riversen Nybegynder
08. juni 2003 - 15:59 #12
arne_v: burde Comparator egentlig ikke modtage Comparable's istedet for objects? Er der nogen dybere grund?
Avatar billede arne_v Ekspert
08. juni 2003 - 15:59 #13
Altså hvis jeres compartor hedder  MedlemComparator:

Collections.sort(output, new MedlemComparator());
Avatar billede arne_v Ekspert
08. juni 2003 - 16:05 #14
riversen>

De vise fædre hos SUN har valgt at lade argumenterne være object.

Og det giver også lidt mening.

Hvis objekterne implememtede Comparable interfacet, så kan man nemlig bare bruge:

Collections.sort(lst);

Comparator'en kommer kun ind i billedet når de ikke implementerer
Comparable.

Så derfor synes jeg at det giver mening at argumenterne kun er Object.
Avatar billede riversen Nybegynder
08. juni 2003 - 16:07 #15
tænkte nok der var en grund.
Avatar billede pigegruppe Nybegynder
08. juni 2003 - 16:16 #16
Hmm... Der er ingen fejl, men der er heller ikke noget der bliver sorteret... Skal comparator "delen" mon ind i koden hvor tingene bliver vist på listen?
Avatar billede arne_v Ekspert
08. juni 2003 - 16:19 #17
Prøv lige at udskriv jeres vector efter sorteringen.

Mit gæt er at den bliver sorteret korrekt, men at GUI'en
ikke er klar over at den er blevet ændret.
Avatar billede arne_v Ekspert
08. juni 2003 - 16:20 #18
Jeg tror med andre ord at skal kalde en fire-et-eller-andet for
at notificere jeres GUI om at data er ændret.
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