的ArrayList内分选的物体的双值(Sorting a double value of an o

2019-07-03 21:55发布

我想通过自己的得分属性的值,它是一个双排序我的自定义类染色体。 这些染色体存储一个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

Answer 1:

要使用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 )。



Answer 2:

为什么不使用PriorityQueue中有比较是这样的:

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

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



Answer 3:

我会实现接口可比 :

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]


Answer 4:

利用Java SE8你可以使用lambda表达式如下所示:

    list.sort((o1, o2) -> Double.compare(o2.doubleField, o1.doubleField));


Answer 5:

由于Java 8可以排序双元素非常简单的列表。

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


文章来源: Sorting a double value of an object within an arrayList