我正在尝试按照得分属性的值对自定义类染色体进行排序。这些染色体存储在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 :(得分:62)
使用Comparator
:
Collections.sort(myList, new Comparator<Chromosome>() {
@Override
public int compare(Chromosome c1, Chromosome c2) {
return Double.compare(c1.getScore(), c2.getScore());
}
});
如果您计划以这种方式对大量List
进行排序,我建议您Chromosome
实施Comparable
界面(在这种情况下,您只需拨打Collections.sort(myList)
即可需要指定一个明确的Comparator
)。
答案 1 :(得分:3)
我会实现接口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]
答案 2 :(得分:3)
为什么不使用PriorityQueue这样的Comparator:
// 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
优先级队列将使您的数据结构按排序顺序排列。
答案 3 :(得分:1)
使用 Java SE8 ,您可以像这样使用lambda表达式:
list.sort((o1, o2) -> Double.compare(o2.doubleField, o1.doubleField));
答案 4 :(得分: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());