28

カスタムクラスの染色体を、doubleであるスコア属性の値で並べ替えようとしています。これらの染色体はArrayList内に保存されます。私はコンパレーターを使わなければならないことを知っていますが、私はこの1時間にオンラインで非常に多くの異なる意見を読んだので、私は完全に混乱しています。

添付されているのは私のコードです。誰かが私を正しい方向に向けることができれば、私は大いに感謝されます。

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までの2倍になります。

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この方法で多数のをソートすることを計画している場合は、インターフェースをChromosome実装することをお勧めします(この場合、明示的に指定することなく、Comparable単に呼び出すことができます)。Collections.sort(myList)Comparator

于 2012-11-17T21:55:24.230 に答える
10

Java SE8では、次のようにラムダ式を使用できます。

list.sort((o1, o2) -> Double.compare(o2.doubleField, o1.doubleField));
于 2018-04-13T16:26:04.047 に答える
3

次のようなコンパレータで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

優先キューは、データ構造をソートされた順序で保持します。

于 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 に答える