如何使用null排序集合并在之后反转列表?

时间:2015-03-17 16:06:38

标签: java sorting null

所以我正在处理日期列表,其中一些值是“”即null。我使用了How to handle nulls when using Java collection sort

的答案
public int compare(MyBean o1, MyBean o2) {
    if (o1.getDate() == null) {
        return (o2.getDate() == null) ? 0 : -1;
    }
    if (o2.getDate() == null) {
        return 1;
    }
    return o2.getDate().compareTo(o1.getDate());
} 

以升序排序列表,将空值放在第一位。

我想要的是按升序排列首先是空值,然后按照上面的代码按升序排列值。然后选择降序以逐字翻转列表。列表中的IE第一个值按降序排列,然后是所有空值。

按照升序Collections.reverseOrder();对列表进行排序后,我尝试了以下操作 这首先保留空值,然后按降序对日期进行排序。

我也试过Collections.reverse(List)。这会将空值放在列表的末尾,但会按日期升序保存日期。

3 个答案:

答案 0 :(得分:4)

在Java 8中,整个事情可以是

Collections.sort(list, 
     Comparator.comparing(MyBean::getDate, 
        Comparator.nullsFirst(Comparator.naturalOrder()))
     .reversed());

答案 1 :(得分:2)

您可以通过简单的比较器实现这一目标。根据您的自定义bean对象修改它。 像这样的东西 -

public class DateComparator implements Comparator<Date> {

    private boolean reverse;

    public DateComparator(boolean reverse) {
        this.reverse = reverse;
    }

    public int compare(Date o1, Date o2) {
        if (o1 == null || o2 == null) {
            return o2 != null ? (reverse ? 1 : -1) : (o1 != null ? (reverse ? -1 : 1) : 0);
        }
        int result = o1.compareTo(o2);
        return reverse ? result * -1 : result;
    }

    public static void main(String[] args) throws ParseException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
        Date[] dates = new Date[]{null, dateFormat.parse("10-10-2013"), null, dateFormat.parse("10-10-2012"), dateFormat.parse("10-10-2015"), dateFormat.parse("10-10-2011"), null};
        List<Date> list = Arrays.asList(dates);
        Collections.sort(list, new DateComparator(false));
        System.out.println(list);
        Collections.sort(list, new DateComparator(true));
        System.out.println(list);
    }
}

答案 2 :(得分:1)

这应该有效:

if (o1.getDate() == null) {
    return (o2.getDate() == null) ? 0 : -1;
}
if (o2.getDate() == null) {
    return -1;
}
return o2.getDate().compareTo(o1.getDate());

我不完全确定你的问题是否要按升序或降序排列非空日期,但在-之前设置o2.getDate().compareTo(o1.getDate())应该可以解决问题。