S'empêcher de comparer float membre de variables à l'aide des Comparateurs
Je suis en mesure de comparer les Chaînes fines, mais voudrais savoir comment je peux les classer des nombres à virgule flottante?
getChange() retourne une Chaîne de caractères. Je veux être en mesure de trier par ordre décroissant. Comment puis-je faire cela?
Mise à JOUR:
package org.stocktwits.helper;
import java.util.Comparator;
import org.stocktwits.model.Quote;
public class ChangeComparator implements Comparator<Quote>
{
public int compare(Quote o1, Quote o2) {
float change1 = Float.valueOf(o1.getChange());
float change2 = Float.valueOf(o2.getChange());
if (change1 < change2) return -1;
if (change1 == change2) return 0; //Fails on NaN however, not sure what you want
if (change2 > change2) return 1;
}
}
J'obtiens l'erreur de compilation:
This method must return a result of type int ChangeComparator.java
En dehors de la NaN problème, vous n'avez aucune garantie instruction de retour dans votre code. De façon réaliste, vous le faites, mais le compilateur ne peut pas dire que parce que vous avez trois différents si les déclarations. Il ne peut pas évaluer les jusqu'à l'exécution, de sorte qu'il pense que vous pourriez obtenir effectivement le dernier si l'instruction et il n'y a pas de clause de retour.
OriginalL'auteur Sheehan Alam | 2010-09-14
Vous devez vous connecter pour publier un commentaire.
Lire la javadoc de
Comparateur de#compare()
méthode.Donc, fondamentalement:
Ou si vous aimez les opérateurs conditionnels:
Cependant, vous devez prendre en compte avec
Float.NaN
. Je ne suis pas sûr de savoir comment vous souhaitez les avoir commandés. En premier? Dernier? De la même manière?J'obtiens l'erreur de compilation (voir mise à jour du code dans ma question): Cette méthode doit retourner un résultat de type int ChangeComparator.java
L'erreur de compilation parle de lui-même. Vous devez vous assurer qu'il toujours renvoie un
int
. Je vais modifier l'exemple.OriginalL'auteur
Comment à ce sujet:
Noter que Java 1.4 introduit
Float#comparer(float, float)
(et un équivalent enDouble
), qui peut être assez bien utilisées directement:(Après l'édition, je remarque que @BorislavGizdov l'a mentionné dans sa réponse déjà.)
Également intéressant de noter que Java 8
Comparateur de#la comparaison de(...)
etComparateur de#comparingDouble(...)
fournir un moyen simple de construction de ces comparateurs directement.Permettra de comparer à l'aide de boîte
Float
valeurs.Permettra de comparer à l'aide de
float
valeurs promues àdouble
valeurs.Étant donné qu'il n'y a pas de
Comparator#comparingFloat(...)
, ma préférence serait d'utiliser lacomparingDouble(...)
de méthode, il s'agit uniquement de type primitif de conversion, plutôt que de la boxe.OriginalL'auteur
Vous pouvez utiliser
Float.comparer(float f1, float f2)
:OriginalL'auteur