Подтвердить что ты не робот

Помогите сравнить переменные-члены float с помощью Comparators

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

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   
4b9b3361

Ответ 1

Прочтите 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. Я не уверен, как вы хотели бы, чтобы они заказали. Первый? Последний? Точно так же?

Ответ 2

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

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(...), поскольку это включает только преобразование примитивного типа, а не бокс.

Ответ 3

Вы можете использовать Float.compare(float f1, float f2):

  public static int compare(float f1, float f2)

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