首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用null对集合进行排序,然后再反转列表?

如何使用null对集合进行排序,然后再反转列表?
EN

Stack Overflow用户
提问于 2015-03-17 16:06:38
回答 3查看 5K关注 0票数 5

因此,我正在处理一个日期列表,其中一些值是“ie null”。我用了How to handle nulls when using Java collection sort的答案

代码语言:javascript
复制
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());
} 

若要在两个升序中对列表进行排序,将空放在第一位。

我想要的是按照升序先有空,然后再按升序排列,就像上面的代码一样。然后,当选择降序按字面顺序翻转列表时。表中的第一个值是降序的,然后是所有的空值。

在按升序Collections.reverseOrder();排序列表之后,我尝试了以下操作:首先保留空,然后按降序排序日期。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-17 16:33:33

您可以通过一个简单的比较器来实现这一点。按照您的自定义bean对象修改它。就像这样-

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-03-17 17:07:54

在Java 8中,整个过程可以是

代码语言:javascript
复制
Collections.sort(list, 
     Comparator.comparing(MyBean::getDate, 
        Comparator.nullsFirst(Comparator.naturalOrder()))
     .reversed());
票数 9
EN

Stack Overflow用户

发布于 2015-03-17 16:15:55

这应该是可行的:

代码语言:javascript
复制
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())应该可以做到这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29104069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档