2010-09-14 7 views
10

¿Puedo comparar cuerdas bien, pero me gustaría saber cómo puedo clasificar los números de coma flotante?Ayuda para comparar variables de miembro flotante usando comparadores

getChange() devuelve una Cadena. Quiero poder ordenar descender. ¿Cómo puedo hacer esto?

ACTUALIZACIÓN:

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; 
    } 
} 

estoy recibiendo el error de tiempo de compilación:

This method must return a result of type int ChangeComparator.java 
+0

Aparte de la cuestión NaN, usted no tiene ninguna instrucción de retorno garantizado en el código. Realísticamente lo haces, pero el compilador no puede decir eso porque tienes tres declaraciones if diferentes. No puede evaluarlos hasta el tiempo de ejecución, por lo que cree que podría pasar la última instrucción if y no hay una cláusula de retorno. – Matt

Respuesta

12

Lee el javadoc de Comparator#compare() método.

Compares its two arguments for order. Returns a negative integer, zero or a positive integer as the first argument is less than, equal to or greater than the second.

Así que, básicamente :

float change1 = o1.getChange(); 
float change2 = o2.getChange(); 
if (change1 < change2) return -1; 
if (change1 > change2) return 1; 
return 0; 

o si se quiere operadores condicionales:

return o1.getChange() < o2.getChange() ? -1 
    : o1.getChange() > o2.getChange() ? 1 
    : 0; 

Sin embargo, tendrá que tener en cuenta con Float.NaN. No estoy seguro de cómo te gustaría tenerlos ordenados. ¿Primero? ¿Último? ¿Igualmente?

+0

ten cuidado con Float.NaN! Supongo que sus datos no tienen NaN, pero dado que NaN en un lado de cualquier comparación siempre devolverá falso (incluso Flotante).NaN == Float.NaN es falso!), Es posible que desee un Float.isNaN (change1) o lo que sea. de lo contrario, el género será aparentemente aleatorio si hay NaN involucrados. –

+0

Recibo el error de tiempo de compilación (vea el código actualizado en mi pregunta): Este método debe devolver un resultado de tipo int \t ChangeComparator.java –

+0

El error de compilación habla por sí mismo. Debes asegurarte de que ** siempre ** devuelve un 'int'. Editaré el ejemplo. – BalusC

13

¿Qué tal esto:

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()); 
     return change1.compareTo(change2); 
    } 
} 

Tenga en cuenta que Java 1.4 introduce Float#compare(float, float) (y su equivalente en Double), que puede ser más o menos utilizado directamente:

public class ChangeComparator implements Comparator<Quote> 
{ 
    public int compare(Quote o1, Quote o2) { 
     return Float.compare(o1.getChange(), o2.getChange()); 
    } 
} 

(Después de la edición, noto que @BorislavGizdov ha mencionado esto en su respuesta ya).


También vale la pena señalar que Java 8 Comparator#comparing(...) y Comparator#comparingDouble(...) proporcionan una forma directa de construir estos comparadores directamente.

Comparator<Quote> changeComparator = Comparator.comparing(Quote::getChange); 

comparará el uso en caja Float valores.

Comparator<Quote> changeComparator = Comparator.comparingDouble(Quote::getChange); 

compararán usando float valores promovidos a double valores.

Dado que no hay Comparator#comparingFloat(...), mi preferencia sería utilizar el método comparingDouble(...), ya que esto solo implica la conversión de tipo primitivo, en lugar del boxeo.

+4

Esta es la mejor respuesta: delegue la comparación a Float's compareTo. –

8

Puede utilizar Float.compare(float f1, float f2):

public static int compare(float f1, float f2) 

Compares the two specified float values. Returns the value 0 if f1 is numerically equal to f2; a value less than 0 if f1 is numerically less than f2; and a value greater than 0 if f1 is numerically greater than f2.

Cuestiones relacionadas