2012-11-17 115 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()); 
相关问题