Avatar billede 4meier Nybegynder
11. januar 2001 - 15:50 Der er 15 kommentarer og
1 løsning

Jeg har en række objekter og skal sortere dem..??

Jeg har det her lille program, med 3 klasser - class kampresultat, class hold, class turneringdet . Det bruges til at holde styr på resultater for en håndbold turnering - så jeg læser/indtaster et resultat eks ( hold1, hold2, 7, 4 )- dette opretter jeg så et \"hold1\" objekt med som så har dataene , mål=7 vundetkampe=1 points=3 m.m - jeg vil så gerne kunner sortere disse hold objekter efter, antal points - hvis lige efter mål og hvis lige efter navn .....

Og det er jeg gået helt kold i jeg er ude i noget ret komplekst hvor jeg laver en array med refs til objekterne og sammenligner ved at kalde en metode på hold klassen der returnere de givne værdier...det må være lettere
Avatar billede disky Nybegynder
11. januar 2001 - 15:53 #1
brugt arraysort direkte på et array af objecter, så skal du bare lave en comperator for hver type sortering du ønsker.

Det er ret nemt

Avatar billede 4meier Nybegynder
11. januar 2001 - 16:05 #2
Ehh aha - en comperator ? jeg har læst lidt om collections m.m men syntes det virkede uoverskueligt - kan du give et lille eks på hvordan den her comperator virker ?? / implementeres
Avatar billede kama Nybegynder
11. januar 2001 - 16:19 #3
Afprøv nedenstående. Tilpas compareTo efter ønske!!!
Fordel: kan sortere alle typer objekter.

klasse-fil 1:

public class CompSort

      public static int minimumPosition(Comparable[] a, int from)
    {
        int minPos = from;
       
        for (int i = from + 1; i < a.length; i++)
            if (a[i].compareTo(a[minPos]) == - 1) minPos = i;
       
        return minPos;
    }
   
    public static void selectionSort(Comparable[] comp)
    {
        for (int n = 0; n < comp.length -1; n++)
        {
            int minPos = minimumPosition(comp, n);
            if (minPos != n)
                ArrayUtil.swap(comp, minPos, n);
        }
    }
}
   
klassefil 2:

public class ArrayUtil

    public static void swap(Comparable[] a, int i, int j)
    {
        Comparable temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
   
    public static void print(Comparable[] a)
    {
        for (int i = 0; i < a.length; i++)
            System.out.println(a[i].toString());
            System.out.println();
    }
}

klassefil 3: (eksempel på type af objekter - tilpas compareTo efter ønske)

public class Person implements Comparable

    public Person(String aNavn, int aAlder)
    {
        navn  = aNavn;
        alder = aAlder;
    }
       
    public String toString()
    {
        return \"Person[Navn = \" + navn + \" - Alder = \" + alder + \"]\";
    }
   
    public int compareTo(Object other)
    {
        Person andenPerson = (Person)other;
        if (alder < andenPerson.alder) return -1;
        if (alder > andenPerson.alder) return 1;
        return 0;   
    }
    private String navn;
    private int alder;
}

klassefil 4: (Test)

public class CompSortTest
{
    public static void main(String[] args)
    {
        Comparable[] compPerson = new Comparable[5];
        compPerson[0] = new Person(\"Thomas\",25);
        compPerson[1] = new Person(\"Peter\",21);
        compPerson[2] = new Person(\"Martin\",27);
        compPerson[3] = new Person(\"Hans\",23);
        compPerson[4] = new Person(\"Søren\",22);
       
        System.out.println(\"Personer usorteret:\");
        ArrayUtil.print(compPerson);
        CompSort.selectionSort(compPerson);
        System.out.println(\"Personer sorteret:\");
        ArrayUtil.print(compPerson);
    }
}
Avatar billede 4meier Nybegynder
11. januar 2001 - 17:01 #4
Ok udemærket Karma, men jeg skal jo lave først en sammenligning på typen \"int\", og hvis 2 ens findes,sammenligne på en anden \"int\", og tilsidst
sammenligne alfabetisk på navn \"string\" ..
men jeg tygger lige lidt på eksemplet...
Avatar billede kama Nybegynder
11. januar 2001 - 17:48 #5
Så skal du jo bare ændre betingelserne i compareTo-metoden! Til sammenligning af strenge kunne du evt. implementere en metode i samme klasse, som du kan kalde fra compareTo.
Avatar billede 4meier Nybegynder
11. januar 2001 - 20:48 #6
Coolt fik det til at virke ;-) men der er vel ikke
noget til hindring for at classe 2-3 bliver lagt ind som private metoder i en overklasse
Avatar billede 4meier Nybegynder
12. januar 2001 - 01:38 #7
ARGHHHHHHHH  - hvorfor virker selectionSort kun
hvis jeg i forvejen køre ArrayUtil.print

altså jeg kan kun få sorteret data hvis jeg først printer dem usorteret ???
Avatar billede disky Nybegynder
12. januar 2001 - 09:50 #8
Ikke for noget, men den måde at gøre det på er den ikke ret besværlig ??

Der er da ingen grund til at lave sin egen sorteringsalgoritme når der er en indbygget i JAVA

Hvorfor ikke bruge funktionen
  public static void sort(Object[] a)

Og så override .compareTo funktionen i dine objector og vupti så sorterer den.

Der er jo ingen grund til at opfinde den dybe tallerken 2 gange.
Avatar billede kama Nybegynder
12. januar 2001 - 09:59 #9
>>4meier: Jeg er ikke helt med på, hvorfor du vil flytte din hjælpeklasse(ArrayUtil). Vær da opmærksom på at metoderne er statiske - jeg tror det er dit problem!
static: knytter sig til klassen.
instans-metoder: knytter sig til objektet.
Avatar billede kama Nybegynder
12. januar 2001 - 10:04 #10
>>disky: Du har på sin vis ret. Ovenstående er en meget fleksibel og fornuftig program-struktur.
Fordele:
Genanvendelighed.
Letlæseligt.
Nemt at udskifte sin sorterings-algoritme.
Avatar billede disky Nybegynder
12. januar 2001 - 10:07 #11
fordele ved array.sort funktionen:

Genanvendelig
endnu nemmere at læse, da man ikke skal bøvle med sin egen sortering.
Hvorfor udskifte sorterings algoritmen, den SUN har lavet er Meget hurtig (vist nok quick sort)

Om den ovenstående er fleksibel og fornuftig struktur, kan jo diskuteres.
Hvis man selv skulle lave det så korrekt, men siden SUN har lavet det for os er der jo ingen grundt til at lave det igen.

Eller laver du også dine egne stream til IO, og din egen udgave af SWING ??? (kunne ikke nære mig)

p.s. endelig en der bruger {} på den korrekt måde :)))

p.s.s. dette er ikke nogen kritik, bare et alternativ
Avatar billede kama Nybegynder
12. januar 2001 - 11:22 #12
Det er smag og behag! Jeg er nybegynder og lidt af et \'control-freak\' og kan godt lide at forstå det hele. Det behager mig derfor at selv skrive nogle ting - også selvom de er lavet i forvejen.
Har du ikke hørt om KamaSwing2? :->

/kama
Avatar billede 4meier Nybegynder
13. januar 2001 - 00:19 #13
fedt med så eget respons ;-)  Hvad mon der lige præcis sker her ??

Person andenPerson = (Person)other;
Der bliver vel lavet et Person objekt med en
andenPerson reference ... men ehh hvorfor er
det Person der er i parentes ??

Og har i nogen ide om hvorfor man skal kalde ArrayUtil.Print en gang inden den gider sortere ....

Avatar billede kama Nybegynder
13. januar 2001 - 12:23 #14
1) Som du ved, så arver alle objekter fra typen \'Object\'. Det der sker er, at du fortæller at typen er af \'Person\' - altså en \'cast\'.
Jeg går ud fra, at du ved hvordan man \'caster\'.

2) Du behøver da ikke at kalde print før den kan sorterer -  du må have modificeret koden til noget forkert. Jeg skal se din kode!

/kama
Avatar billede 4meier Nybegynder
24. januar 2001 - 12:36 #15
Oki - nope jeg totalt grøn i java startede for 2mdr siden med at kode, jeg er ikke helt sikker på jeg er bekendt med nogen casting begreber ;-)

Jeg har testet koden \"copy/paste\" men den vil også
først sortere efter et kald til ArrayUtil.Print ?

Men min kode er ret omfattende - måske kan jeg maile den -

/meier
Avatar billede kama Nybegynder
24. januar 2001 - 16:41 #16
Gør bare det - tma@privat.dk
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