Le tri d'un double de la valeur d'un objet, dans une arrayList
Je suis en train de trier mes classe personnalisée chromosome par la valeur de leur score d'attribut qui est un double. Ces chromosomes sont stockées dans une ArrayList. Je sais que je dois utiliser un comparateur mais j'ai lu beaucoup de divergences d'opinion en ligne dans la dernière heure que je suis tout à fait confus.
Ci-joint mon code, si quelqu'un pouvait me diriger dans la bonne direction, je serais très apprécié.
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;
}
}
Ne sais pas ce faire une différence, mais le score ne peut être qu'un double entre 0.0 et 1.0
trouve cette question alors que google "java double tri" pour mon génétique alghorithm
OriginalL'auteur Melo1991 | 2012-11-17
Vous devez vous connecter pour publier un commentaire.
D'utiliser un
Comparateur
:Si vous prévoyez sur le tri de nombreuses
List
s de cette façon, je vous suggérerais d'avoirChromosome
mettre en œuvre lesComparable
de l'interface (dans ce cas, il vous suffit d'appelerCollections.sort(myList)
, sans avoir besoin de spécifier explicitementComparator
).Il y a un
Collections.reverse
méthode si c'est ce que vous êtes après.Ou tout simplement c2.compareTo(c1) au lieu de c1.compareTo(c2).
Je ne savais pas à propos de
Double.compare
. Je vous remercie.OriginalL'auteur
Pourquoi ne pas utiliser un PriorityQueue avec un Comparateur comme ceci:
La file d'attente de priorité sera alors de garder votre structure de données dans l'ordre de tri.
Vous pourriez, ou plutôt de l'ensemble de la liste de tableaux, de vous appeler .ajouter sur chaque Chromosome.
OriginalL'auteur
Je voudrais mettre en œuvre l'interface Comparable:
Remarque que j'ai déménagé score à l'intérieur de la Classe..
Maintenant vous pouvez utiliser n'importe quel Collection qui est Triée (comme un TreeSet)
Si vous insistez sur l'utilisation de la liste de tableaux que vous pouvez utiliser:
Résultat:
Ou si vous ne souhaitez pas mettre en place la
Comparable
interface, vous pouvez utiliser leCollections.sort( List<T>, Comparator<? super T> )
méthodeJ'ai essayé d'utiliser ce code @Frank et il ne veut toujours pas de tri 🙁
J'ai ajouté une preuve de concept, notez que j'ai aussi affiné la méthode compareTo.
Voir l'entrée dans le Chromosome constructeur est de la fixation du montant des gènes du chromosome. Le Score est de la remise en forme de la fonction de partition des variables dans les gènes. Je veux trier ma liste pour avoir les meilleurs scores dans le haut et le pire, au fond. Ce n'est pas faire ça, je suis juste tellement confus ici!
OriginalL'auteur
Depuis java 8, vous pouvez trier la liste des éléments Doubles très simple.
ou
Si vous voulez rentrer dans l'ordre de la liste, mais vous ne voulez pas changer votre début de la liste, vous pouvez le faire comme suit:
OriginalL'auteur
Avec Java SE8 vous pouvez utiliser lambda expression comme:
OriginalL'auteur