2012-11-17 113 views
13

我正在嘗試使用雙倍的score值屬性對我的自定義類染色體進行排序。這些染色體存儲在ArrayList中。我知道我必須使用一個比較器,但在過去一個小時內我在網上閱讀了很多不同的觀點,所以我完全困惑。對數組中的對象進行雙值排序

附加是我的代碼,如果有人能指出我在正確的方向,我將不勝感激。

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; 
    } 
} 

不知道該有所作爲,但成績只能是一個雙間,幷包括0.0〜1.0

+0

發現,而這個問題谷歌「java double sort」用於我的遺傳alghorithm – sweetrenard

回答

45

要使用Comparator

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

如果你打算以這種方式分揀衆多List的I建議有Chromosome實現Comparable接口(在這種情況下,你可以簡單地調用Collections.sort(myList),而不需要指定明確的Comparator)。

+0

我如何獲得升序列表? – Melo1991

+0

@ Melo1991有一個['Collections.reverse'](http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#reverse(java.util.List) )方法,如果這就是你所追求的。 – arshajii

+1

或者只是c2.compareTo(c1)而不是c1.compareTo(c2)。 – Machisuji

2

我會實現這個接口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); 
    } 
} 

請注意,我移動分數裏面的類..

現在你可以使用任何Collection是排序(如TreeSet

如果你堅持使用ArrayList中,你可以使用:

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); 

結果:

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

當使用這個,我想排序arrayList我調用collections.sortmethod是嗎?你能告訴我該怎麼做嗎? @Frank – Melo1991

+0

或者如果你不想實現'Comparable'接口,你可以使用'Collections.sort(List ,Comparator )'方法 – Robin

+0

我試過使用這個代碼@Frank,它仍然不會排序它:-( – Melo1991

3

爲什麼不使用PriorityQueueComparator這樣的:

// 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 

的優先級隊列會保持你的數據結構的排序順序。

+0

我會在創建我的實際arrayList的主類中有這段代碼嗎? – Melo1991

+0

您可以或不是整個ArrayList,而是在每個染色體上調用.add。 – hd1

0

既然是java 8,你可以對Double元素進行排序,非常簡單。

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

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

如果你想獲得排序列表,但你不想改變你的開始列表,你可以做到這一點如下:

List<Chromosome> sortedList = list.stream() 
    .sorted(Comparator.comparingDouble(A::getScore)) 
    .collect(Collectors.toList()); 
相關問題