Помогите сравнить переменные-члены с плавающей запятой, используя компараторы - PullRequest
11 голосов
/ 14 сентября 2010

Я могу хорошо сравнить строки, но хотел бы знать, как я могу ранжировать числа с плавающей точкой?

getChange () возвращает строку. Я хочу иметь возможность сортировать по убыванию. Как я могу это сделать?

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

Я получаю ошибку времени компиляции:

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

Ответы [ 3 ]

16 голосов
/ 14 сентября 2010

Как насчет этого:

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

Обратите внимание, что Java 1.4 представила Float#compare(float, float) (и эквивалент в Double), который может быть в значительной степени использован напрямую:

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

(После редактирования я заметил, что @BorislavGizdov уже упоминал об этом в своем ответе.)


Также стоит отметить, что Java 8 Comparator#comparing(...) иComparator#comparingDouble(...) обеспечивает простой способ построения этих компараторов напрямую.

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

Будет выполнено сравнение с использованием значений Float в штучной упаковке.

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

Будет выполнено сравнение с использованием float значений повышены до double значений.

Учитывая, что Comparator#comparingFloat(...) нет, я бы предпочел использовать метод comparingDouble(...), так как это включает только преобразование примитивных типов, а не боксирование.

15 голосов
/ 14 сентября 2010

Считайте метод javadoc Comparator#compare().

Сравнивает два аргумента для порядка. Возвращает отрицательное целое число, ноль или положительное целое число, поскольку первый аргумент меньше, равен или больше второго.

Итак, в основном :

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

Или, если вам нравятся условные операторы:

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

Однако вам необходимо учитывать Float.NaN.Я не уверен, как вы хотели бы заказать их.Первый?Прошлой?Точно так же?

8 голосов
/ 03 июня 2014

Можно использовать Float.compare(float f1, float f2):

  public static int compare(float f1, float f2)

Сравнивает два указанных значения с плавающей запятой.Возвращает значение 0, если f1 численно равно f2;значение меньше 0, если f1 численно меньше f2;и значение больше 0, если f1 численно больше, чем f2.

...