Avatar billede keendk Nybegynder
04. november 2004 - 10:59 Der er 20 kommentarer og
1 løsning

Sortering af ArrayList

Hej... jeg har et lille problem.

Jeg har lavet en ArrayList hvor der er tastet mange data ind, der er følgende variabler i (CPRNR, Fag, ID, Status), og nu vil jeg gerne have at de bliver listet så alle de index med lavest CPRNR kommer først. Yderligere vil jeg gerne at de så derefter kommer i alfabetisk rækkefølge mht. Fag (dat, eoe, org, sam), og til sidst at ID også er ordentligt katagoriseret(U1, U2, U3 osv.)

Jeg håber der er en der kan hjælpe mig med ovenstående.

her er et lille uddrag af koden:

opgaveliste = new ArrayList();
       
        opgaveliste.add(new Opgave(1, "dat", "U1", "G"));
        opgaveliste.add(new Opgave(1, "dat", "U2", "G"));
        opgaveliste.add(new Opgave(1, "dat", "U3", "IA"));
        opgaveliste.add(new Opgave(1, "dat", "U4", "G"));
        opgaveliste.add(new Opgave(1, "dat", "U5", "G"));
        opgaveliste.add(new Opgave(1, "dat", "U6", "G"));
        opgaveliste.add(new Opgave(1, "dat", "U7", "IA"));
        opgaveliste.add(new Opgave(1, "dat", "U8", "IA"));
        opgaveliste.add(new Opgave(1, "dat", "G1", "G"));
        opgaveliste.add(new Opgave(1, "dat", "G2", "G"));
        opgaveliste.add(new Opgave(1, "eoe", "U1", "G"));
        opgaveliste.add(new Opgave(1, "eoe", "U2", "G"));
        opgaveliste.add(new Opgave(1, "eoe", "U3", "G"));
        opgaveliste.add(new Opgave(1, "org", "U1", "G"));
        opgaveliste.add(new Opgave(1, "org", "U2", "G"));
Avatar billede arne_v Ekspert
04. november 2004 - 11:08 #1
Du laver en comparator og kalder Collections.sort med din ArrayList og den.
Avatar billede arne_v Ekspert
04. november 2004 - 11:09 #2
Eksempel:

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

public class SortArrayListComplex {
    public static void main(String[] args) {
        List lst = new ArrayList();
        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;
    }
}
Avatar billede arne_v Ekspert
04. november 2004 - 11:09 #3
Din compare metode skal bare første teste på CPRNR derefter fag etc..
Avatar billede arne_v Ekspert
04. november 2004 - 11:18 #4
Mit eksempel lidt modificeret til at sortere på begge felter:

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

public class SpecialSort {
    public static void main(String[] args) {
        List lst = new ArrayList();
        lst.add(new Data("CCC","1"));
        lst.add(new Data("BB", "2"));
        lst.add(new Data("A", "3"));
        lst.add(new Data("A", "4"));
        lst.add(new Data("A", "2"));
        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) {
        if(((Data)o1).getV1().compareTo(((Data)o2).getV1()) == 0)
        {
            return ((Data)o1).getV2().compareTo(((Data)o2).getV2());
        } else {
            return 0;
        }
    }
    public boolean equals(Object obj)  {
        return false;
    }
}
Avatar billede keendk Nybegynder
04. november 2004 - 11:24 #5
Men hvad nu nå mit CPRNR er defineret som int?
Avatar billede arne_v Ekspert
04. november 2004 - 11:57 #6
Først retter jeg lige den sidste kode så den virker:
Avatar billede arne_v Ekspert
04. november 2004 - 11:57 #7
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SpecialSort {
    public static void main(String[] args) {
        List lst = new ArrayList();
        lst.add(new Data("CCC","1"));
        lst.add(new Data("BB", "2"));
        lst.add(new Data("A", "3"));
        lst.add(new Data("A", "4"));
        lst.add(new Data("A", "2"));
        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) {
        int res = ((Data)o1).getV1().compareTo(((Data)o2).getV1());
        if(res == 0)
        {
            return ((Data)o1).getV2().compareTo(((Data)o2).getV2());
        } else {
            return res;
        }
    }
    public boolean equals(Object obj)  {
        return false;
    }
}
Avatar billede arne_v Ekspert
04. november 2004 - 11:58 #8
Og så en version med int:
Avatar billede arne_v Ekspert
04. november 2004 - 11:58 #9
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SpecialSortInt {
    public static void main(String[] args) {
        List lst = new ArrayList();
        lst.add(new DataInt("CCC", 1));
        lst.add(new DataInt("BB", 2));
        lst.add(new DataInt("A", 3));
        lst.add(new DataInt("A", 4));
        lst.add(new DataInt("A", 2));
        for(int i = 0; i < lst.size(); i++) {
            System.out.println((DataInt)lst.get(i));
        }
        Collections.sort(lst, new CmpInt());
        for(int i = 0; i < lst.size(); i++) {
            System.out.println((DataInt)lst.get(i));
        }
    }
}

class DataInt {
    private String v1;
    private int v2;
    public DataInt(String v1, int v2) {
        this.v1 = v1;
        this.v2 = v2;
    }
    public String toString() {
        return (v1 + " " + v2);
    }
    public String getV1() {
        return v1;
    }
    public int getV2() {
        return v2;
    }

}

class CmpInt implements Comparator {
    public int compare(Object o1, Object o2) {
        int res = ((DataInt)o1).getV1().compareTo(((DataInt)o2).getV1());
        if(res == 0)
        {
            return ((DataInt)o1).getV2() - ((DataInt)o2).getV2();
        } else {
            return res;
        }
    }
    public boolean equals(Object obj)  {
        return false;
    }
}
Avatar billede arne_v Ekspert
04. november 2004 - 18:58 #10
OK ?
Avatar billede keendk Nybegynder
04. november 2004 - 20:40 #11
Hvis jeg nu skal finde ud af om en af de studerende kan gå op til eksamen? Hvordan kan man gøre, så man låser CPRNR og Fag fast, og samtidig tæller antal godkendte opgaver op?

Jeg har prøvet med dette, men det virker ikke helt...

public void testDat()
    {
        int i = 0; \\dette reræsenterer antallet af godkendte opgaver
        int j = 1; \\dette havde jeg forestillet mig skulle være noget med samlet antal studerende(antal CPRNR)
        Iterator it = opgaveliste.iterator();
        while(it.hasNext())
        {
            Opgave temp = (Opgave) it.next();

            if((temp.CPRNR == j && temp.Fag == "dat") && (temp.ID != "G1" && temp.ID != "G2") && temp.Status == "G")
            {
                i++;

            }
        }
Avatar billede arne_v Ekspert
04. november 2004 - 20:45 #12
Hvad sker der ?
Avatar billede keendk Nybegynder
04. november 2004 - 20:59 #13
den viser en masse 5 taller...:

5
5
5
5
5
osv... Den viser sikkert lige så mange som der er objekter i ArrayList, men den skal jo kun vise det en gang, og så må den gerne gøre det for alle de studerende.
Avatar billede arne_v Ekspert
04. november 2004 - 21:05 #14
Ovenstående kode udskriver ikke noget så jeg er lidt lost ...
Avatar billede keendk Nybegynder
04. november 2004 - 21:16 #15
ups... har glemt System.out.println(i);

den skulle gerne ind et sted... og så smider den bare en masse 5-taller ud...
Avatar billede arne_v Ekspert
04. november 2004 - 21:59 #16
Variabeln i kan vel ikke være 5 fra start af ?
Avatar billede keendk Nybegynder
04. november 2004 - 22:04 #17
nej... Den skal være nul,og så hver gang der er en opgave der er blevet godkendt tæller i 1 op. Så den er god nok... Det er bare om man skal gøre det på en anden måde end med iterator metode...

Er ny til java, så... er lidt i tvivl...
Avatar billede arne_v Ekspert
06. november 2004 - 15:06 #18
Må vi se noget lidt mere komplet kode ?

Umiddelbart lyder det msytisk, men der er jo nok en forklaring.
Avatar billede keendk Nybegynder
08. november 2004 - 20:21 #19
hvis jeg nu har følgende ArrayList:

opgaveliste.add(new Opgave(1, "dat", "U1", "G"));

Hvordan får jeg så trukket alle informationerne ud af listen?

Kan jeg overhovedet lagre så mange informationer i arraylisten?
Avatar billede arne_v Ekspert
08. november 2004 - 21:00 #20
Noget i stil med:

Opgave opg = (Opgave)opgaveliste.get(0);
string fag = opg.getFag();

--------------

Sagtens !
Avatar billede arne_v Ekspert
21. november 2004 - 20:32 #21
keendk>

Tid at få afsluttet spørgsmålet ?
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