Помогите сравнить переменные-члены 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
Ответы
Ответ 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.