Avatar billede eajava Nybegynder
02. juni 2007 - 23:06 Der er 5 kommentarer

Sorter en arraylist på en attribut som de objekter den indeholder

Hej allesammen,
Jeg har en arraylist fyldt med en række objekter (af samme type selvfølgelig) og disse objekter har en attribut der hedder point. Jeg vil gerne lave en metode hvor jeg kan sortere mit arraylist på sådan en måde at det objekt der har den flest antal point står forrest i rækken og dernæst kommer det objekt med næsthøjst point og så fremdeles. Dernæst vil jeg kunne returnere det sorterede arraylist. (Jeg tror det er en god hvis man tager og henter objekterne ud en efter en efter flest point og lægger dem ned i en ny arrayList som man så returnere )

Mange tak for hjælpen
Avatar billede arne_v Ekspert
02. juni 2007 - 23:37 #1
Du kan bruge en comparator.

Et gammelt eksempel fra lageret:

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 bauerdata Nybegynder
03. juni 2007 - 13:48 #2
#!/usr/bin/python
class obj:
  def __init__(self, point):
      self.point=point
 
def compare(x,y):
  if x.point >= y.point:
      return 1
  return -1

liste=[]

for i in range( 10, 1, -1 ):
  liste.append(obj(i))
print [obj.point for obj in liste ]
liste.sort(cmp=compare)
print [obj.point for obj in liste ]

Output:
[10, 9, 8, 7, 6, 5, 4, 3, 2]
[2, 3, 4, 5, 6, 7, 8, 9, 10]
Avatar billede mikkelbm Nybegynder
03. juni 2007 - 18:17 #3
>> bauerdata

Du har set at vi er i Java kategorien ? :)
Avatar billede thesurfer Nybegynder
03. juni 2007 - 19:08 #4
mikkelbm> Hvis du kigger de spørgsmål bauerdata deltager i igennem, vil du se at i næsten alle programmeringsrelaterede spørgsmål, svarer bauerdata i Python, selvom spørgmålene er stillet i/til ASP, C#, PHP, osv..

Når det eneste værktøj man har, er en hammer, ligner alle problemer jo søm!.. :-)
Avatar billede arne_v Ekspert
07. august 2007 - 22:45 #5
eajava>

Er du kommet videre ?
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