我正在尝试使用offerValues
方法按compareTo
对列表进行排序。
如果offerValue是一个像8.00这样的个数,它可以正常工作,但是,如果offerValue是20.00或15.00,则将它们视为2(对于20.00)和1(对于15.00)。不明白。
Comparator<OfferVO> comparatorAsc = (o1, o2) -> {
if (o1.getOfferValue() == null && o2.getOfferValue() == null) {
return 0;
} else if (o1.getOfferValue() != null) {
return o1.getOfferValue().compareTo(o2.getOfferValue());
} else {
return -1;
}
};
Collections.sort(offersList, comparatorAsc);
OfferVO.class:
public class OfferVO extends OfferBaseVO implements Serializable {
private static final long serialVersionUID = 1L;
private String offerValue;
public String getOfferValue() {
return offerValue;
}
public void setOfferValue(String offerValue) {
this.offerValue = offerValue;
}
}
输出示例:
"offerValue": "5.00",
"offerValue": "3.00",
"offerValue": "3.00",
"offerValue": "20.00",
"offerValue": "15.00",
"offerValue": "15.00",
答案 0 :(得分:3)
字符串是compared lexicographical(通常是字母)而不是数字。这意味着"10"
将在"2"
之前,依此类推。如果要比较数值,则需要将字符串解析为数字,例如使用Double.valueOf()
。
答案 1 :(得分:2)
1)要将String作为数字值进行比较,请根据String.compare()
的字典顺序将它们转换为数字。
2)请注意,您的比较器不是对称的。
Comparator.compare()
规范指出:
实施者必须确保sgn(compare(x,y))== -sgn(compare(y, x))用于所有x和y。
这里:
else if (o1.getOfferValue() != null) {
return o1.getOfferValue().compareTo(o2.getOfferValue());
}
您仅依靠o1.getOfferValue()
的非无效性来比较两个对象:
要对舍入进行更精确的数值比较,在比较浮点值(例如
)时,应使用epsilonfloat 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());
}
答案 2 :(得分:0)
使用以下代码:
Comparator<OfferVO> comparatorDesc = (o1, o2) -> {
if (o1.getOfferValue() == null && o2.getOfferValue() == null) {
return 0;
} else if (o2.getOfferValue() != null) {
return
Double.valueOf(o2.getOfferValue()).compareTo(Double.valueOf(o1.getOfferValue()));
} else {
return -1;
}
};