1) Чтобы сравнить строку как числовое значение, преобразуйте их в числа в компараторе, так как String.compare()
зависит от лексикографического порядка.
2) Обратите внимание, что ваш компаратор не симметричен.
Спецификация Comparator.compare()
гласит:
Разработчик должен убедиться, что sgn (сравнить (x, y)) == -sgn (сравнить (y,
х)) для всех х и у.
Здесь:
else if (o1.getOfferValue() != null) {
return o1.getOfferValue().compareTo(o2.getOfferValue());
}
Вы полагаетесь на ненулевое значение только o1.getOfferValue()
для сравнения двух объектов:
Чтобы написать более точное числовое сравнение о округлении, вы должны использовать эпсилон при сравнении плавающих значений, таких как
float epsilon = 0.0001F;
if (o1.getOfferValue() == null && o2.getOfferValue() == null){
return 0;
} else if (o1.getOfferValue() != null && o2.getOfferValue() != null) {
return Math.abs(Float.valueOf(o1.getOfferValue()) - Float.valueOf(o2.getOfferValue())) < epsilon)
}
// TODO
// as last you have to decide here how to sort if only one of the value is not null
Если при сравнении округление не является проблемой, достаточно: Float.compare()
:
if (o1.getOfferValue() == null && o2.getOfferValue() == null){
return 0;
} else if (o1.getOfferValue() != null && o2.getOfferValue() != null) {
return Float.compare(Float.valueOf(o1.getOfferValue()), Float.valueOf(o2.getOfferValue());
}