Avatar billede bossehansen Nybegynder
24. marts 2005 - 12:12 Der er 5 kommentarer og
1 løsning

Sortering af arraylist - Flere kriterier

Jeg har lavet en sortering som arne_v foreslå i http://eksperten.dk/spm/486213. Mit spørgsmål er nu, om man kan lave denne sortering, så man sorterer på flere kriterier.

F.eks. først på GetObjektNummer og derefter på GetObjektNavn.

list[0] = "2, Jens"
list[1] = "1, Peter"
list[2] = "2, Allan"

bliver til:

list[0] = "1, Peter"
list[1] = "2, Allan"
list[2] = "2, Jens"
Avatar billede arne_v Ekspert
24. marts 2005 - 12:31 #1
Udover IComparer er der jo også IComparable.

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
24. marts 2005 - 12:32 #2
Men teknikken i de 2 er helt den samme me dhensyn til flere kriteriet.

Først sammenligner du objekt nummer, hvis de er ens så sammenligner du objekt navn.
Avatar billede bossehansen Nybegynder
24. marts 2005 - 12:39 #3
Tusind tak for det hurtige svar :-) Jeg vil lige teste det med det samme.
Avatar billede arne_v Ekspert
24. marts 2005 - 12:42 #4
Eksempel:

using System;
using System.Collections;

public class MitObjekt : IComparable
{
    private int etNummer;
    private string etNavn;
    public MitObjekt(int etNummer, string etNavn)
    {
        this.etNummer = etNummer;
        this.etNavn = etNavn;
    }
    public int EtNummer
    {
        get
        {
            return etNummer;
        }
    }
    public string EtNavn
    {
        get
        {
            return etNavn;
        }
    }
    public int CompareTo(object o)
    {
        MitObjekt mo = (MitObjekt)o;
        if(etNummer == mo.etNummer)
        {
            return etNavn.CompareTo(mo.etNavn);
        }
        else
        {
            return etNummer - mo.etNummer;
        }
    }
    public override string ToString()
    {
        return (etNummer + " " + etNavn);
    }

}


class MainClass
{
    public static void Main(string[] args)
    {
        ArrayList list = new ArrayList();
        list.Add(new MitObjekt(3, "TRE"));
        list.Add(new MitObjekt(2, "TO-A"));
        list.Add(new MitObjekt(2, "TO-C"));
        list.Add(new MitObjekt(2, "TO-B"));
        list.Add(new MitObjekt(1, "ET"));
        Console.WriteLine("Før sortering:");
        for(int i = 0; i < list.Count; i++)
        {
            Console.WriteLine(list[i]);
        }
        list.Sort();
        Console.WriteLine("Efter sortering:");
        for(int i = 0; i < list.Count; i++)
        {
            Console.WriteLine(list[i]);
        }
    }
}
Avatar billede bossehansen Nybegynder
24. marts 2005 - 12:57 #5
Det virker perfekt :-) Smid et svar, så får du dine velfortjente point.
Avatar billede arne_v Ekspert
24. marts 2005 - 13:02 #6
ok
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