Java 日期不起作用的Collections.sort()

Java 日期不起作用的Collections.sort(),java,Java,我正在尝试对ArrayList w.r.t termDate进行排序。 ArrayList包含名字、姓氏、电子邮件、开始日期、结束日期和状态 日期可以为空或空。我必须进行相应的比较,并将所有空/空日期值放在末尾 Collections.sort(usersList, new Comparator<User>() { public int compare(User o1, User o2) { System.out

我正在尝试对ArrayList w.r.t termDate进行排序。 ArrayList包含名字、姓氏、电子邮件、开始日期、结束日期和状态

日期可以为空或空。我必须进行相应的比较,并将所有空/空日期值放在末尾

Collections.sort(usersList, new Comparator<User>() {
                public int compare(User o1, User o2) {
                    System.out.println("Term Date: " + o1.getTermDate() +" " +o2.getTermDate());
                    if((o1.getTermDate() == null || "".equals(o1.getTermDate())) && (o2.getTermDate() == null || "".equals(o2.getTermDate()))) {
                        System.out.println("Term Date1: 0 " + o1.getTermDate() + " " + o2.getTermDate());
                        return 0; //They are both null, both equal
                    }
                    if((o1.getTermDate() == null || "".equals(o1.getTermDate())) && (o2.getTermDate() != null || "".equals(o2.getTermDate()))) {
                        System.out.println("Term Date2: -1 " + o1.getTermDate() + " " + o2.getTermDate());
                        return -1; // The first is null and the second is not, return the first as lower than the second
                    }
                    if((o1.getTermDate() != null || "".equals(o1.getTermDate())) && (o2.getTermDate() == null || "".equals(o2.getTermDate()))) {
                        System.out.println("Term Date3: 1 " + o1.getTermDate() + " " + o2.getTermDate());
                        return 1; //The first is not null and the second is, return the first as higher than the second
                    }
                    else {
                        System.out.println("Term Date4: " + o1.getTermDate() + " " + o2.getTermDate());
                        return o1.getTermDate().compareTo(o2.getTermDate()); //Return the actual comparison
                    }
                }
            });
部分输出:

user,five,user5@gmail.com,08/07/2015,,Active
usernew2,two,usernew2@gmail.com,08/11/2015,,Active
myname2,hello3,qwerty1@gmail.com,08/11/2015,,Active
user,noUserAuth,user_nouserauth@gmail.com,08/21/2015,,Active

TermDate的类型是什么? 如果是字符串,则将其解析为日期。(如果您在此日期有工作要做,则不应使用日期的字符串表示) 要比较两个日期,请在其中一个日期为空时定义您的行为,
对于一般情况,返回日期1.compareTo(date2)

基于您的代码,我假设您的日期是字符串对象(当您将它们与空字符串进行比较时),当我查看输出时,日期是按字母顺序排序的,这是基于此假设的预期输出

解决方案:更改模型并使用(在Java8上)或
Date
(Java8之前)作为数据类型。
或者(不推荐),您可以在比较后将字符串转换为
LocalDate
(这本身就比较慢)。

您确定您的条件是正确的(因为倒过来的条件似乎不正确:)?我会把它们放在两个
布尔
变量中,并在
if
语句中使用和否定它们。
user,five,user5@gmail.com,08/07/2015,,Active
usernew2,two,usernew2@gmail.com,08/11/2015,,Active
myname2,hello3,qwerty1@gmail.com,08/11/2015,,Active
user,noUserAuth,user_nouserauth@gmail.com,08/21/2015,,Active