28

我试图通过他们的分数属性的值对我的自定义类染色体进行排序,这是一个双倍。这些染色体存储在一个 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 之间的两倍

4

5 回答 5

73

要使用Comparator

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

如果您打算List以这种方式对大量 s 进行排序,我建议您Chromosome实现Comparable接口(在这种情况下,您可以简单地调用s Collections.sort(myList),而无需指定显式Comparator)。

于 2012-11-17T21:55:24.230 回答
10

使用Java SE8,您可以像这样使用 lambda 表达式:

list.sort((o1, o2) -> Double.compare(o2.doubleField, o1.doubleField));
于 2018-04-13T16:26:04.047 回答
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

然后,优先级队列将使您的数据结构保持有序。

于 2012-11-17T19:50:23.327 回答
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);
    }
}

请注意,我在班级内移动了分数..

现在您可以使用任何已排序的集合(如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]
于 2012-11-17T19:47:21.387 回答
3

从 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()); 
于 2018-03-02T07:26:03.297 回答