Avatar billede general_custer Nybegynder
21. november 2005 - 17:48 Der er 25 kommentarer og
1 løsning

sortering af objekter

Hej Eksperter...

Jeg sidder med et lille problem i mit program.

Jeg har et ArrayList med en masse objecter af typen Time

Disse Time objecter indeholder (uge,dag,tid)

Jeg skal nu sortere dem med den tidligste time først.

Altså først ser den på ugerne så på dagene og tilsidst tidspunktet på dagen (i heltal 1-24).

hvilken kommando skal jeg bruge til at sortere mit array?
Avatar billede dr_chaos Nybegynder
21. november 2005 - 18:06 #1
prøv at kigge her måske kan det hjælpe dig.
Avatar billede dr_chaos Nybegynder
21. november 2005 - 18:06 #2
Avatar billede general_custer Nybegynder
21. november 2005 - 18:16 #3
hmm problemet er at jeg "sagtens" kan finde sider der viser mig hvordan jeg sorterer efter fx. uger. men mit program skal sortere efter uger, og for hver uge skal den sortere i dage og for hver dag skal den sortere i tidsrum....ved godt det er besværligt men det er sådan det skal være.
Avatar billede mikkelbm Nybegynder
21. november 2005 - 18:43 #4
Jeg tror den bedste måde at gøre det på, er at generere en slags timestamp ud fra dine oplysninger og så sammenligne på den.

Måske:

int timestamp = uge + dag + tid;

Og så en Comparator:

class MyComparator implements Comparator
{
    public int compare (Object obj1, Object obj2)
    {
        return ((Time)obj1).getTimeStamp() - ((Time)obj2).getTimeStamp();
    }
}

Derefter bruger du Collections klassens statiske metode:

Collections.sort (dinList, new MyComparator());
Avatar billede arne_v Ekspert
21. november 2005 - 20:48 #5
public int getTimeStamp() {
    return uge*7*24+dag*24+timer;
}
Avatar billede general_custer Nybegynder
21. november 2005 - 21:48 #6
det kan være jeg skal prøve at beskrive mit problem noget bedre.

Jeg har en masse TimeSlot objektet der består af følgende:

TimeSlot(int week, int day, int tid)

Jeg har sat en masse af disse ind i en arrayList,i vilkårlig orden.

Jeg vil nu sortere dem så den første tid kommer først....altså så den sorterer efter tid, dag og uge.
Avatar billede arne_v Ekspert
21. november 2005 - 21:51 #7
det var faktisk det mikkel gav løsningen på

mikkels kode

kombineret med min getTimeStamp som dog lige skal rettes til

public int getTimeStamp() {
    return week*7*24+day*24+tid;
}
Avatar billede mikkelbm Nybegynder
21. november 2005 - 21:51 #8
Er det:

"Altså først ser den på ugerne så på dagene og tilsidst tidspunktet på dagen"

eller:

"Jeg vil nu sortere dem så den første tid kommer først....altså så den sorterer efter tid, dag og uge."


Du vil :) ???
Avatar billede general_custer Nybegynder
21. november 2005 - 21:57 #9
hmm hvordan forklarer jeg det bedst.. Den skal bare sortere så det første tidspunkt kommer først ud, altså det tidligste tidspunkt skal først ud.

Eksempel...vi har følgende:

(43,5,16)
(22,4,18)
(53,9,5)

disse skulle gerne komme ud som

(22,4,18)
(43,5,16)
(53,9,5)
Avatar billede mikkelbm Nybegynder
21. november 2005 - 22:00 #10
Og vi går ud fra at det er (uge, dag, tid)

Så gør du som vi tidligere har beskrevet. Er der noget af det du ikke er med på?
Avatar billede arne_v Ekspert
21. november 2005 - 22:02 #11
mikkel jeg tror at du bliver nødt til at skrive et komplet eksempel
Avatar billede mikkelbm Nybegynder
21. november 2005 - 22:02 #12
Det gør jeg lige.
Avatar billede mikkelbm Nybegynder
21. november 2005 - 22:10 #13
Så var der lige et køreklart eksempel:

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

public class TimeTest
{
    public static void main(String[] args)
    {
        new TimeTest();
    }
   
    public TimeTest ()
    {
        ArrayList times = new ArrayList ();
        times.add(new TimeSlot(43,5,16));
        times.add(new TimeSlot(22,4,18));
        times.add(new TimeSlot(53,9,5));
   
        System.out.println ("Befor:");
        printList (times);   
        Collections.sort(times, new MyComparator());
        System.out.println ("After:");
        printList (times);
    }
   
    private void printList (ArrayList list)
    {
        for (int i = 0; i<list.size(); i++)
            System.out.println (list.get(i));
    }
   
    private class MyComparator implements Comparator
    {
        public int compare (Object obj1, Object obj2)
        {
            return ((TimeSlot)obj1).getTimeStamp() - ((TimeSlot)obj2).getTimeStamp();
        }
    }
   
    private class TimeSlot
    {
        private int week, day, hour;
       
        public TimeSlot (int week, int day, int hour)
        {
            this.week = week;
            this.day = day;
            this.hour = hour;
        }
       
        public int getTimeStamp ()
        {
            return week*7*24+day*24+hour;
        }
       
        public String toString ()
        {
            return "Week: " + week + " day: " + day + " hour: " + hour;
        }
    }
}
Avatar billede mikkelbm Nybegynder
23. november 2005 - 12:51 #14
Brugbart?
Avatar billede nir Nybegynder
25. november 2005 - 13:24 #15
standard metoden vil være at lade dim tim-klasse implementere interfacet Comparable. Du skal så skrive en CompareTo-metode, returnerende en int:

public class Time implements Comparable
{
    private int time;
    private int dag;
    private int uge;
   
    public Time(int t,int d,int u)
    {
        time=t;
        dag=d;
        uge=u;
    }
   
    public int compareTo(Object o)
    {
        if (uge!=((Time)o).getUge())
            return uge-((Time)o).getUge();
        if (dag!=((Time)o).getDag())
            return dag-((Time)o).getDag();
       
        return time-((Time)o).getTime();
    }
   
    public int getUge()        {return uge ;}
    public int getDag()        {return dag ;}
    public int getTime()            {return time;}

ArrayList-klassen har ikke en sort-metode, med den findes i Arrays-klassen.
Denne tager et array af Comparable-objekter og sorterer listen.

trin 1. converter arraylisten til et array:
        Object[] myList= myArrayList.toArray();

trin 2. sorter myList :
        Arrays.sort(myList);

Dine data (time-objekterne) er nu i et array som du nødvendigvis må overføre til en ArrayList, hvis du stadig ønsker denne data-struktur :

  myArrayList.clear();
  for (int i=0;i<myList.length;i++)
    myArrayList.add(myList[i]);
Avatar billede mikkelbm Nybegynder
25. november 2005 - 13:30 #16
>> nir

Nu vrøvler du da vist. Du kan sagtens sortere en ArrayList. Kig i mit eksempel!

Jeg tvivler nu også stærkt på, at din comparemetode har det forventede resultat...
Avatar billede mikkelbm Nybegynder
25. november 2005 - 13:34 #17
Collection.sort (myArrayList);

Gør det samme som:

Arrays.sort(myArray);
Avatar billede mikkelbm Nybegynder
25. november 2005 - 13:36 #18
Og det er ligemeget om du skriver din egen Comparator eller indbygger den i objektet.
Hvis det nu ikke var dit eget objekt du skulle sorterer, kan du jo af gode grunde ikke implementere det i objektet, men vil være nødsaget til at skrive en ekstern klasse til at gøre det.
Avatar billede arne_v Ekspert
25. november 2005 - 13:48 #19
Der er ganske rigtigt ikke nogen grund til at konvertere ArrayList->array->ArrayList.

Comparator er til vilkårlige sorteringer.

Comparable er til hvis der er en "naturlig" sorterings rækkefølge.
Avatar billede mikkelbm Nybegynder
25. november 2005 - 13:55 #20
Arne, så hvad foreslår du i det her tilfælde?
Avatar billede arne_v Ekspert
25. november 2005 - 14:01 #21
Begge virker.

Vil man bygge sorterings rækkefølgen ind i de objekter som skal sorteres
eller vil man bygge den ind i den kode som sorterer objekterne ?

Det kan man jo diskutere meget udfra fine OO betragtninger om hvor man
synes at det hører hjemme.

Jeg tror at jeg bruger ca. 3/4 comparator og 1/4 comparable.
Avatar billede general_custer Nybegynder
25. november 2005 - 14:52 #22
Beklager jeg ikke har skrevet før, men min internet forbindelse har desværre været nede...

Jeg siger mange tak for svarene, især til dig mikkelbm, det er virkelig noget jeg kan bruge...
Avatar billede general_custer Nybegynder
25. november 2005 - 14:52 #23
kan du forresten ikke lige komme med et svar mikkelbm
Avatar billede mikkelbm Nybegynder
25. november 2005 - 14:55 #24
Kommer her.

Arne kom jo med ideen til hvordan timestamp kunne se ud.
Avatar billede mikkelbm Nybegynder
20. januar 2006 - 23:18 #25
Lukketid?
Avatar billede dr_chaos Nybegynder
04. februar 2006 - 16:55 #26
Du mangler at lukke 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