Avatar billede webcreator Nybegynder
21. november 2004 - 16:42 Der er 13 kommentarer og
1 løsning

Sorter ArrayList efter navn

Hej Eksperter.

Jeg har en ArrayList med objekter (kontaktpersoner). Jeg ønsker at arrayet sorteres efter navne på disse kontaktpersoner. Hvordan gøres det med ArrayList.Sort() ?
Avatar billede arne_v Ekspert
21. november 2004 - 16:47 #1
To muligheder:

1)  lad kontakt personer arve fra IComparable

2)  send et objekt med som andet argument til Sort der arver fra IComparer
Avatar billede arne_v Ekspert
21. november 2004 - 16:47 #2
Eksempel:

using System;
using System.Collections;

public class Foobar : IComparable
{
    private int a;
    private string b;
    public Foobar() : this(0, "")
    {
    }
    public Foobar(int a, string b)
    {
        this.a = a;
        this.b = b;
    }
    public int A
    {
        get
        {
            return a;
        }
        set
        {
            a = value;
        }
    }
    public string B
    {
        get
        {
            return b;
        }
        set
        {
            b = value;
        }
    }
    public int CompareTo(object o)
    {
        return (a - ((Foobar)o).A);
    }
    public override string ToString()
    {
        return ("(" + a + "," + b + ")");
    }
}

public class FoobarAComparer : IComparer
{
    int IComparer.Compare(Object o1, Object o2)
    {
        return (((Foobar)o1).A - ((Foobar)o2).A);
    }
}

public class FoobarRevAComparer : IComparer
{
    int IComparer.Compare(Object o1, Object o2)
    {
        return -(((Foobar)o1).A - ((Foobar)o2).A);
    }
}

public class FoobarBComparer : IComparer
{
    int IComparer.Compare(Object o1, Object o2)
    {
        return (((Foobar)o1).B.CompareTo(((Foobar)o2).B));
    }
}

public class FoobarRevBComparer : IComparer
{
    int IComparer.Compare(Object o1, Object o2)
    {
        return -(((Foobar)o1).B.CompareTo(((Foobar)o2).B));
    }
}

class ManySort
{
    private static void print(string descr, ArrayList list)
    {
        Console.Write(descr + ": [");
        foreach(object o in list)
        {
            Console.Write(o);
        }
        Console.WriteLine("]");
    }
    public static void Main(string[] args)
    {
        ArrayList list = new ArrayList();
        list.Add(new Foobar(5, "AAAAA"));
        list.Add(new Foobar(4, "BBBB"));
        list.Add(new Foobar(3, "CCC"));
        list.Add(new Foobar(2, "DD"));
        list.Add(new Foobar(1, "E"));
        print("Original", list);
        list.Sort();
        print("After natural sort (= sort on A)", list);
        list.Sort(new FoobarRevAComparer());
        print("After reverse sort on A", list);
        list.Sort(new FoobarAComparer());
        print("After sort on A", list);
        list.Sort(new FoobarBComparer());
        print("After sort on B", list);
        list.Sort(new FoobarRevBComparer());
        print("After reverse sort on B",list);
    }
}
Avatar billede arne_v Ekspert
21. november 2004 - 16:49 #3
Med en string skal du brugre noget a la FoobarBComparer (løsning 2).

Men det var nu ret nemt at omskrive CompareTo til at sammenligne på B fremfor A
(løsning 1).
Avatar billede webcreator Nybegynder
21. november 2004 - 17:18 #4
Hm, jeg er helt lost her.

Jeg får et kæmpe eksempel, og havde slet ikke regnet med, at det var så besværligt.
Avatar billede webcreator Nybegynder
21. november 2004 - 17:19 #5
Kunne du ikke være venlig at kommentere din kode? Jeg er mest interesseret i at lære noget når jeg bygger mine programmer - ikke bare at kopiere :)
Avatar billede arne_v Ekspert
21. november 2004 - 17:22 #6
Du skal ikke bruge ret meget af koden.

kontaktpersonliste.Sort(new KontaktPersonComparer());

til at sortere og en:

public class KontaktPersonComparer : IComparer
{
    int IComparer.Compare(Object o1, Object o2)
    {
        return (((KontaktPerson)o1).Navn.CompareTo(((KontaktPerson)o2).Navn));
    }
}
Avatar billede arne_v Ekspert
21. november 2004 - 17:22 #7
En comparer klasse er en klasse som kan compare 2 objekter af en given klasse.
Avatar billede arne_v Ekspert
21. november 2004 - 17:25 #8
Det var løsning 2.

Hvis du vil løsning 1 skal du rette din KontaktPerson klasse:

public class KontaktPerson : IComparable
{
    ...
    public int CompareTo(object o)
    {
        return navn.CompareTo(((KontaktPerson)o).navn);
    }
Avatar billede arne_v Ekspert
21. november 2004 - 17:26 #9
En comparable klasse er en klasse som kan sorteres naturligt.
Avatar billede webcreator Nybegynder
21. november 2004 - 17:27 #10
Dvs. at jeg skal erstatte ... med den nuværende kode på min klasse ?

Hvad gør jeg efterfølgende ?

Jeg troede faktisk, at man bare kunne skrive arrayList.Sort(), hvis man havde en ToString på sin klasse, der returnerede det man ønskede der skulle sorteres i (fx navn).
Avatar billede webcreator Nybegynder
21. november 2004 - 17:32 #11
Hov, nu virker det pludselig med arrayList.Sort().
Så har jeg nok taget fejl af ToString og CompareTo :)
Avatar billede arne_v Ekspert
21. november 2004 - 17:32 #12
Ja.

kontaktpersonliste.Sort();

Så vidt jeg ved kan man kun kalde Sort uden argumenter når elementerne er
comparable.

Alle objekter har en ToString. Men ofte vil den bare returnere klassens
navn. Og så er der jo ikke meget sortering.
Avatar billede webcreator Nybegynder
21. november 2004 - 17:46 #13
Nej, det har du da helt ret i :)
Tusind tak - igen. Smider du et svar ?
Avatar billede arne_v Ekspert
21. november 2004 - 17:47 #14
kommer her
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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