2010-09-14 16 views
10

Jestem w stanie porównać ciągi Strings, ale chciałbym wiedzieć, w jaki sposób mogę ustawić liczby zmiennoprzecinkowe?Pomaganie w porównywaniu zmiennych zmiennych swobodnych za pomocą Komparatorów

Funkcja getChange() zwraca ciąg znaków. Chcę móc sortować malejąco. Jak mogę to zrobić?

UPDATE:

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

otrzymuję błąd czasu kompilacji:

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

Poza kwestią NaN, nie masz zagwarantowane instrukcji return w kodzie. Realistycznie to robisz, ale kompilator nie może tego powiedzieć, ponieważ masz trzy różne instrukcje if. Nie można ich przetestować do czasu wykonania, więc wydaje się, że można pominąć ostatnią instrukcję if i nie ma klauzuli return. – Matt

Odpowiedz

12

Przeczytaj javadoc z Comparator#compare() metody.

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.

Więc zasadzie:

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

lub jeśli chcesz operatory warunkowe:

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

Ty jednak trzeba wziąć pod uwagę przy Float.NaN. Nie wiem, jak chciałbyś je zamówić. Pierwszy? Ostatni, ubiegły, zeszły? Na równi?

+0

uważaj na Float.NaN! Domyślam się, że twoje dane nie mają NaN, ale ponieważ NaN po jednej stronie jakiegokolwiek porównania zawsze zwróci false (nawet Float.NaN == Float.NaN jest fałszywe!), Możesz chcieć Float.isNaN (change1) lub cokolwiek sprawdzić. w przeciwnym razie sortowanie będzie pozornie przypadkowe, jeśli w grę wchodzą NaN. –

+0

Otrzymuję błąd czasu kompilacji (zobacz zaktualizowany kod w moim pytaniu): Ta metoda musi zwrócić wynik typu int \t ChangeComparator.java –

+0

Błąd kompilacji mówi sam za siebie. Musisz upewnić się, że ** zawsze ** zwraca 'int'. Będę edytować przykład. – BalusC

13

Jak o tym:

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

Zauważ, że Java 1.4 wprowadzono Float#compare(float, float) (a odpowiednikiem w Double), który może być dość dużo stosowany bezpośrednio:

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

(Po zakończeniu edycji, zauważam że @BorislavGizdov wspomniał już o tym w swojej odpowiedzi.)


Warto również zauważyć, że Java 8 Comparator#comparing(...) i Comparator#comparingDouble(...) zapewniają prosty sposób konstruowania tych komparatorów bezpośrednio.

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

Porównywany będzie przy użyciu wartości w pudełkach o wartości Float.

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

porówna użyciu float wartości promowanych do double wartości.

Biorąc pod uwagę, że nie istnieje Comparator#comparingFloat(...), moją preferencją byłoby użycie metody comparingDouble(...), ponieważ dotyczy to jedynie konwersji typu pierwotnego, a nie boksowania.

+4

To jest najlepsza odpowiedź - przekazuj porównanie do porównania Float's. –

8

Można użyć 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.