2012-11-17 21 views
13

Próbuję posortować swój własny chromosom klasy według wartości ich atrybutu wyniku, który jest podwójny. Te chromosomy są przechowywane w ArrayList. Wiem, że muszę korzystać z komparatora, ale przeczytałem tyle różnych opinii w Internecie w ciągu ostatniej godziny, że jestem kompletnie zdezorientowany.Sortowanie podwójnej wartości obiektu wewnątrz tablicyList

Załączony jest mój kod, jeśli ktoś mógłby wskazać mi właściwy kierunek, byłbym bardzo wdzięczny.

public class Chromosome 
{ 

    public Gene[] genes; 
    public double score; 

    public Chromosome(int l) 
    { 
     genes = new Gene[l]; 
    } 

    public int getLength() 
    { 
     return genes.length; 
    } 

    public void printChromo() 
    { 
     for(int i=0;i<this.genes.length;i++) 
     { 
      System.out.println(""+this.genes[i].teacher+","+ 
       this.genes[i].lecture+","+ 
       this.genes[i].room+","+ 
       this.genes[i].time+""); 
     } 
    } 

    public void setScore(double score) 
    { 
     this.score=score; 
    } 

    public double getScore() 
    { 
     return this.score; 
    } 
} 

nie wiem to zrobić różnicę, ale wynik może być tylko dwukrotnie między włącznie 0,0 do 1,0

+0

znaleźć na to pytanie podczas gdy Google "podwójny sortowanie java" dla mojego algorytmu genetycznego – sweetrenard

Odpowiedz

45

Aby użyć Comparator:

Collections.sort(myList, new Comparator<Chromosome>() { 
    @Override 
    public int compare(Chromosome c1, Chromosome c2) { 
     return Double.compare(c1.getScore(), c2.getScore()); 
    } 
}); 

Jeśli planujemy sortowania liczne List S w ten sposób Proponuję o Chromosome implementować interfejs Comparable (w którym to przypadku można po prostu zadzwonić Collections.sort(myList), bez konieczności określenie wyraźnego Comparator).

+0

Jak mogę uzyskać listę rosnącą? – Melo1991

+0

@ Melo1991 Istnieje ['Collections.reverse'] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#reverse (java.util.List)) metoda, jeśli tego właśnie szukasz. – arshajii

+1

Lub po prostu c2.compareTo (c1) zamiast c1.compareTo (c2). – Machisuji

2

Chciałbym zaimplementować interfejs Comparable:

public class Chromosome implements Comparable<Chromosome>{ 

    private double score; 

    public Chromosome(double score){ 
     this.score = score; 
    } 
    @Override 
    public int compareTo(Chromosome o) { 
     return new Double(score).compareTo(o.score); 
    } 
    @Override 
    public String toString() { 
     return String.valueOf(score); 
    } 
} 

pamiętać, że przesunięty wynik w klasie ..

Teraz możesz użyć dowolnego Collection, który jest posortowany (jak TreeSet)

Jeśli upierasz się przy użyciu ArrayList można użyć:

ArrayList<Chromosome> out = new ArrayList<Chromosome>(); 
out.add(new Chromosome(20)); 
out.add(new Chromosome(15)); 
System.out.println(out); 
Collections.sort(out); 
System.out.println(out); 

Wynik:

[0.2, 0.15] 
[0.15, 0.2] 
+0

Podczas korzystania z tego i chcę posortować listęListę nazywam kolekcją.sortmethod tak? Czy możesz mi powiedzieć, jak to zrobić? @Frank – Melo1991

+0

Jeśli nie chcesz implementować interfejsu "Comparable", możesz użyć metody 'Collections.sort (List , Comparator )' method – Robin

+0

Próbowałem użyć tego kodu @Frank i nadal nie będzie posortuj to :-( – Melo1991

3

Dlaczego nie użyć PriorityQueue z Comparator jak ten:

// your code 
PriorityQueue<Chromosome> entries = new PriorityQueue<Chromosome>(1, new Comparator<Chromosome>() { 
    @Override 
    public int compare(Chromosome arg0, Chromosome arg1) { 
     return (Double)(arg1.getScore()).compareTo((Double)arg0.getScore()); 
    } 
}); 
entries.addAll(arrayListOfChromosomes); 
// your code 

The kolejka priorytetowa zachowa strukturę danych w porządku posortowanym.

+0

Czy miałbym ten fragment kodu w mojej głównej klasie, gdzie mogę utworzyć moją rzeczywistą listę arrayList? – Melo1991

+0

Można, lub zamiast całej tablicy ArrayList, wywołać .add na każdym chromosomie. – hd1

0

Od java 8 można sortować listę elementów podwójnych bardzo proste.

list.sort(Comparator.comparingDouble(Chromosome::getScore)); 

lub

Collections.sort(list, omparator.comparingDouble(Chromosome::getScore)); 

Jeśli chcesz uzyskać posortowaną listę, ale nie chcesz zmieniać listy rozpoczynające można to zrobić w następujący sposób:

List<Chromosome> sortedList = list.stream() 
    .sorted(Comparator.comparingDouble(A::getScore)) 
    .collect(Collectors.toList()); 
Powiązane problemy