为什么SortBy值结果错误?

时间:2018-06-28 06:12:26

标签: java collections

我正在尝试使用offerValues方法按compareTo对列表进行排序。 如果offerValue是一个像8.0​​0这样的个数,它可以正常工作,但是,如果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",

3 个答案:

答案 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()的非无效性来比较两个对象:

要对舍入进行更精确的数值比较,在比较浮点值(例如

)时,应使用epsilon
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());
}

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