Avatar billede trenskow Nybegynder
31. december 2004 - 00:21 Der er 13 kommentarer og
1 løsning

sortere objekter i arrayliste

Hejsa allesammen
og godt nytår

Jeg vil gerne sortere de objekter som jeg har liggende i en arrayliste som jeg har. Den hentes med denne linie i min webservice

ArrayList kampe = c.getAlleKampe();

navnet er lidt misvisende, for det er faktisk en liste med hold, men det vil jeg rette senere.

de objekter som ligger der, er som sagt hold, som er lavet med en contructor i hold klassen som ser sådan her ud.

        public Hold(string holdNavn, int vundneKampe, int uafgjorteKampe, int tabteKampe, int maalImod, int maalFor, int point)
        {
            this.holdNavn = holdNavn;
            this.vundneKampe = vundneKampe;
            this.uafgjorteKampe = uafgjorteKampe;
            this.tabteKampe = tabteKampe;
            this.maalImod = maalImod;
            this.maalFor = maalFor;
            this.point = point;           
        }

jeg har så lavet en compare sådan her, også i hold klassen

public int Compare(object x, object y)
        {
            Hold h1 = (Hold) x;
            Hold h2 = (Hold) y;
            if(h1.getPoint() > h2.getPoint())
            {
                return 1;
            }
            if(h1.getPoint() < h2.getPoint())
                return -1;
            else
            {
                if((h1.getMaalHjemme() - h1.getMaalUde()) > (h2.getMaalHjemme() - h2.getMaalUde()))
                    return 1;

                if((h1.getMaalHjemme() - h1.getMaalUde()) < (h2.getMaalHjemme() - h2.getMaalUde()))
                    return -1;

                else
                {
                    if(h1.getMaalHjemme() > h2.getMaalHjemme())
                        return 1;

                    if(h1.getMaalHjemme() < h2.getMaalHjemme())
                        return -1;

                    else
                        return 0;
                }
            }
        }

men hvad skal jeg skrive i min controller, for at den sorterer mit arrayliste?

jeg har lavet denne her indtil videre.

ArrayList kampe = c.getAlleKampe();
            kampe.Sort();
            string ret = "";
            foreach( object a in kampe)
            {
                Hold x = (Hold) a;
                ret += x.getHoldNavn() + ";" +
                    ((int) x.getVundneKampe() + x.getTabteKampe() + x.getUafgjorteKampe()).ToString() + ";" +
                    x.getVundneKampe().ToString() + ";" +
                    x.getUafgjorteKampe().ToString() + ";" +
                    x.getTabteKampe().ToString() + ";" +
                    x.getMaalHjemme().ToString() + ";" +
                    x.getMaalUde().ToString() + ";" +
                    x.getPoint().ToString() + "\n";
            }
            return ret;

men den der kampe.sort() gør ingenting....
Avatar billede arne_v Ekspert
31. december 2004 - 00:25 #1
Din Hold klasse skal arve fra IComparable og have en:

public int CompareTo(object o)
Avatar billede kalp Novice
31. december 2004 - 00:26 #2
jeg sikkert den eneste som er interesseret i dette hehe.. men må jeg se din
getAlleKampe() metode?
Avatar billede arne_v Ekspert
31. december 2004 - 00:27 #3
Jeg lavede engang et sortering på alle mulige måder 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 trenskow Nybegynder
31. december 2004 - 00:30 #4
@Kalp

public ArrayList getAlleKampe()
        {
            resultater = new ArrayList();
            // skal hente alle kampe, og udregne tabellen.
            //
            ArrayList temp = new ArrayList(kdb.getAll());
           
            foreach(Kamp ka in temp)
            {
                hjemmehold = ka.getHjemmeHold().ToString();
                udehold = ka.getUdehold().ToString();
                hjemmemaal = ka.getHjemmeMaal();
                udemaal = ka.getUdeMaal();

                if(ka.getHjemmeMaal() > ka.getUdeMaal())
                {
                    // HJEMMESEJR
                    // først skal der ligges point til hjemmehold
                    if(this.findesHold(ka.getHjemmeHold().ToString()) == true)
                    {
                        // tilføj point
                        this.addPoint(ka.getHjemmeHold().ToString(), 3);
                        // SÅ SKAL DER LIGGES EN VUNDNEKAMPE TIL HJEMMEHOLD
                        this.addVUTKampe(ka.getHjemmeHold().ToString(), 1, 0, 0);
                    }
                    else
                    {
                        // opret hold, tilføj point og VUT
                        this.opretHold(new Hold(ka.getHjemmeHold().ToString(), 0, 0, 0, 0, 0, 0));
                        this.addPoint(ka.getHjemmeHold().ToString(), 3);
                        this.addVUTKampe(ka.getHjemmeHold().ToString(), 1, 0, 0);
                    }
                    // så skal udeholdet have VUT
                    if(this.findesHold(ka.getUdehold().ToString()) == true)
                    {
                        // OG EN TABTEKAMPE TIL UDEHOLD
                        this.addVUTKampe(ka.getUdehold().ToString(), 0, 0, 1);
                    }
                    else
                    {
                        // opret hold og tildel VUT
                        opretHold(new Hold(ka.getUdehold().ToString(), 0,0,0,0,0,0));
                        this.addVUTKampe(ka.getUdehold().ToString(), 0,0,1);
                    }
                }

                if(ka.getHjemmeMaal() == ka.getUdeMaal())
                {
                    // UAFGJORT
                    // først skal hjemmeholdet have point og VUT
                    if(this.findesHold(ka.getHjemmeHold().ToString()) == true)
                    {
                        // så skal mål og VUT ligges til hjemmeholdet
                        this.addPoint(ka.getHjemmeHold().ToString(), 1);
                        this.addVUTKampe(ka.getHjemmeHold().ToString(), 0, 1, 0);
                    }
                    else
                    {
                        // opret hold, og tilføj point og VUT
                        this.opretHold(new Hold(ka.getHjemmeHold().ToString(), 0, 0, 0, 0, 0, 0));
                        this.addPoint(ka.getHjemmeHold().ToString(), 1);
                        this.addVUTKampe(ka.getHjemmeHold().ToString(), 0, 1, 0);
                       
                    }
                    if(this.findesHold(ka.getUdehold().ToString()) == true)
                    {
                        // så skal udeholdet have point og VUT
                        this.addPoint(ka.getUdehold().ToString(), 1);
                        this.addVUTKampe(ka.getUdehold().ToString(), 0, 1, 0);
                    }
                    else
                    {
                        // opret hold, og tildel point og VUT
                        this.opretHold(new Hold(ka.getUdehold().ToString(), 0,0,0,0,0,0));
                        this.addPoint(ka.getUdehold().ToString(), 1);
                        this.addVUTKampe(ka.getUdehold().ToString(), 0, 1, 0);
                    }
                }
                if(ka.getHjemmeMaal() < ka.getUdeMaal())
                {
                    // UDESEJR
                    // Så skal hjemmeholdet have 0 point og VUT
                    if(this.findesHold(hjemmehold) == true)
                    {
                        // tilføj VUT, sal inge point have
                        this.addVUTKampe(hjemmehold, 0,0,1);
                    }
                    else
                    {
                        Hold holdTest = new Hold(hjemmehold, 0,0,0,0,0,0);
                        // opret hld og giv VUT
                        // this.opretHold(hjemmehold, 0,0,0,0,0,0);
                        opretHold(holdTest);
                        //opretHold(new Hold(hjemmehold, 0,0,0,0,0,0));
                        //Hold h = new Hold(hjemmehold, 0,0,0,0,0,0);
                        //opretHold(h);
                        this.addVUTKampe(hjemmehold, 0,0,1);
                    }
                    // så skal udejoldet have 3 point og VUT
                    if(this.findesHold(ka.getUdehold().ToString()) == true)
                    {
                        // Tildel udehold 3 point og VUT
                        this.addPoint(ka.getUdehold().ToString(), 3);
                        this.addVUTKampe(ka.getUdehold().ToString(), 1, 0, 0);
                    }
                    else
                    {
                        // opret hold først, 3 point og VUT
                        this.opretHold(new Hold(ka.getUdehold().ToString(), 0, 0, 0, 0, 0, 0));
                        this.addPoint(ka.getUdehold().ToString(), 3);
                        this.addVUTKampe(ka.getUdehold().ToString(), 1, 0, 0);
                    }
                }

                // SÅ SKAL DER LIGGES MÅL TIL BEGGE HOLD
                // HJEMMEHOLD
                if(this.findesHold(ka.getHjemmeHold().ToString()) ==  true)
                {
                    // TILFØJ MÅL
                    this.addMaal(ka.getHjemmeHold().ToString(), ka.getHjemmeMaal(), ka.getUdeMaal());
                }
               
                if(this.findesHold(ka.getUdehold().ToString()) == true)
                {
                    // TILFØJ MÅL
                    this.addMaal(ka.getUdehold().ToString(), ka.getUdeMaal(), ka.getHjemmeMaal());
                }

            }
            return resultater;
        }
Avatar billede trenskow Nybegynder
31. december 2004 - 00:31 #5
@Arne
Hele min hold klasse ser sådan her ud.. der er en metode med som hedder public int CompareTo(object o)

using System;

namespace fodboldService
{
    /// <summary>
    /// Summary description for Hold.
    /// </summary>
    public class Hold: IComparable
    {
        private int runde, holdID, point;
        private string holdNavn;
        private int vundneKampe;
        private int uafgjorteKampe;
        private int tabteKampe;
        private int maalImod;
        private int maalFor;


        public Hold(string holdNavn, int vundneKampe, int uafgjorteKampe, int tabteKampe, int maalImod, int maalFor, int point)
        {
            this.holdNavn = holdNavn;
            this.vundneKampe = vundneKampe;
            this.uafgjorteKampe = uafgjorteKampe;
            this.tabteKampe = tabteKampe;
            this.maalImod = maalImod;
            this.maalFor = maalFor;
            this.point = point;           
        }

        public int Compare(object x, object y)
        {
            Hold h1 = (Hold) x;
            Hold h2 = (Hold) y;
            if(h1.getPoint() > h2.getPoint())
            {
                return 1;
            }
            if(h1.getPoint() < h2.getPoint())
                return -1;
            else
            {
                if((h1.getMaalHjemme() - h1.getMaalUde()) > (h2.getMaalHjemme() - h2.getMaalUde()))
                    return 1;

                if((h1.getMaalHjemme() - h1.getMaalUde()) < (h2.getMaalHjemme() - h2.getMaalUde()))
                    return -1;

                else
                {
                    if(h1.getMaalHjemme() > h2.getMaalHjemme())
                        return 1;

                    if(h1.getMaalHjemme() < h2.getMaalHjemme())
                        return -1;

                    else
                        return 0;
                }
            }
        }

        public int getRunde()
        {
            return runde;
        }
        public int getPoint()
        {
            return point;
        }
        public void setPoint(int p)
        {
            point = point + p;
        }
   
        public int getVundneKampe()
        {
            return vundneKampe;
        }
        public int getUafgjorteKampe()
        {
            return uafgjorteKampe;
        }
        public int getTabteKampe()
        {
            return tabteKampe;
        }
        public int getMaalHjemme()
        {
            return maalFor;
        }
        public int getMaalUde()
        {
            return maalImod;
        }
        public void setMaalHjemme(int m)
        {
            maalFor = maalFor + m;
        }
        public void setMaalUde(int m)
        {
            maalImod = maalImod + m;
        }
        public void setVundneKampe(int k)
        {
            vundneKampe = vundneKampe + k;
        }
        public void setUafgjorteKampe(int k)
        {
            uafgjorteKampe = uafgjorteKampe + k;
        }
        public void setTabteKampe(int k)
        {
            tabteKampe = tabteKampe + k;
        }
        public void setVUTKampe(int v, int u, int t)
        {
            vundneKampe = vundneKampe + v;
            uafgjorteKampe = uafgjorteKampe + u;
            tabteKampe = tabteKampe + t;
        }
        public string getHoldNavn()
        {
            return holdNavn;
        }
        public void setMaal(int hjemmeMaal, int udeMaal)
        {
            maalFor = maalFor + hjemmeMaal;
            maalImod = maalImod + udeMaal;
        }
        public override string ToString()
        {
            return holdNavn;
        }
        #region IComparable Members

        public int CompareTo(object obj)
        {
            // TODO:  Add Hold.CompareTo implementation
            return 0;
        }

        #endregion
    }
}
Avatar billede trenskow Nybegynder
31. december 2004 - 00:32 #6
doh.. har lige set at de sidste linier i hold indeholder
// TODO:  Add Hold.CompareTo implementation

så skal jeg lige finde ud af hvad der skal stå der
Avatar billede arne_v Ekspert
31. december 2004 - 00:35 #7
Der skal vel stå det som der er i den Compare metode du har lavet

x = this
y = obj
Avatar billede trenskow Nybegynder
31. december 2004 - 00:38 #8
@Arne

skal der stå det hele som der er i min Compare metode, eller skal
x = this
y = obj

"bare" skrives derind?
Avatar billede arne_v Ekspert
31. december 2004 - 00:39 #9
Du skal kopiere hele indholdet men erstatte x med this og y med obj.
Avatar billede trenskow Nybegynder
31. december 2004 - 00:41 #10
ok, jeg prøver...

men når jeg debugger, så kommer den slet ikke ind i
public int CompareTo(object obj)

når jeg kalder kampe.Sort()
Avatar billede trenskow Nybegynder
31. december 2004 - 00:43 #11
jow.. nu gør den...
Avatar billede trenskow Nybegynder
31. december 2004 - 00:46 #12
så er der point til Arne_v.... takker mange gange for hjælpen endnu en gang :-)
Avatar billede trenskow Nybegynder
31. december 2004 - 01:36 #13
@arne_v
Hvis du vil smide et svar her, så skal jeg give dig pointene :-)
Avatar billede arne_v Ekspert
31. december 2004 - 10:56 #14
svar kommer her

(jeg var gået i seng)
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