Avatar billede fastpoint Nybegynder
12. januar 2005 - 14:10 Der er 8 kommentarer og
1 løsning

Sortere tal

Jeg har en klasse med en med en getTal() metode

jeg vil gerne sortere en masse elementer ved at tjekke deres getTal() metode og sætte dem ind i en ArrayList

både en efter største tal og en efter mindste tal

Jeg kan ikke hitte ud af det:/
Avatar billede arne_v Ekspert
12. januar 2005 - 14:25 #1
Sæt dem ind i ArrayList først og sorter den med den indbyggede sort metode.
Avatar billede arne_v Ekspert
12. januar 2005 - 14:27 #2
Eksempel:

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
12. januar 2005 - 14:28 #3
Din comparator skal så se ud som:

class DinComparator implements Comparator {
    public int compare(Object o1, Object o2) {
        return ((DinKlasse)o1).getTal() - ((DinKlasse)o2).getTal();
    }
    public boolean equals(Object obj)  {
        return false;
    }
}
Avatar billede kalp Novice
12. januar 2005 - 14:30 #4
Går ud fra de er i en arraylist i forvejen..

Så kan du tjekke første element med alle andre elementer i din arraylist... for hver gang det første er større end det andet bytter de plads.. herefter tjekker du det andet element med resten af listen og så det 3 osv.. kan du gøre i en løkke du skal lige passe på indexoutofbounds exception eller hvad den hedder


giv dog point til arne da der ikke er grund til at opfinde den dybe tallerken igen og igen hehe.. tænkte bare mere på tankegangen.. der findes andre sorteringsmetoder også.. masser
Avatar billede fastpoint Nybegynder
12. januar 2005 - 14:35 #5
svar arne.
Avatar billede arne_v Ekspert
12. januar 2005 - 14:35 #6
Jeg fandt endnu et sorterings eksempel (det er med Vector men det er
helt det samme med ArrayList:

import java.util.*;

public class SortAgain {
  public static void main(String[] args) {
      Vector v = new Vector();
      v.add(new Data("A", 0, 2, 0));
      v.add(new Data("B", 1, 1, 1));
      v.add(new Data("C", 2, 0, 2));
      System.out.println(v);
      Collections.sort(v, new HighPoint());
      System.out.println(v);
  }
}

class Data {
  private String name;
  private int wins;
  private int losses;
  private int points;
  public Data() {
      name = "";
      wins = 0;
      losses = 0;
      points = 0;
  }
  public Data(String n, int w, int l, int p) {
      name = n;
      wins = w;
      losses = l;
      points = p;
  }
  public String getName() {
      return name;
  }
  public int getWins() {
      return wins;
  }
  public int getLosses() {
      return losses;
  }
  public int getPoints() {
      return points;
  }
  public void setName(String s) {
      name = s;
  }
  public void setWins(int i) {
      wins = i;
  }
  public void setLosses(int i) {
      losses = i;
  }
  public void setPoints(int i) {
      points = i;
  }
  public String toString() {
      return ("[" + name + ":" + points + "]");
  }
}

class HighPoint implements Comparator {
  public int compare(Object o1, Object o2) {
      return ((Data)o2).getPoints() - ((Data)o1).getPoints();
  }
  public boolean equals(Object obj)  {
      return false;
  }
}
Avatar billede arne_v Ekspert
12. januar 2005 - 14:37 #7
kalp>

Med få elementer er sorterings algoritmen ligegyldig.

Med  mange elementer så er det næste altid Quick Sort der er bedst.
Avatar billede arne_v Ekspert
12. januar 2005 - 14:37 #8
svar
Avatar billede kalp Novice
12. januar 2005 - 14:39 #9
arme>> Det rigtigt nok:) men jeg ville bare supplere med lidt "manuel" sorteringmetode bare så det kunne give et billede af hvordan det kunne fungere.. måske det flotteste eksempel;)
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