Подтвердить что ты не робот

Сортировка двойного значения объекта внутри arrayList

Я пытаюсь сортировать свою собственную хромосому класса по значению атрибута их оценки, который является двойным. Эти хромосомы хранятся в 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

4b9b3361

Ответ 1

Чтобы использовать 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).

Ответ 2

Почему бы не использовать 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

Я бы реализовал интерфейс 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]