在Java中按日期排序ArrayList

时间:2014-10-15 06:32:53

标签: java sorting

我试图按照useby日期对Product对象列表进行排序,但有些对象可能有Date useby = null

我想要做的是按照" useby"对列表进行排序。日期,并将Date useby = null的所有对象放在列表的底部或顶部。

public static void sort() {
        Collections.sort(list, new Comparator<Product>() {
            public int compare(Product o1, Product o2) {
                if (o1.getUseDate() == null || o2.getUseDate() == null) {
                    return 0;
                } else {
                    return o1.getUseDate().compareTo(o2.getUseDate());
                }
            }
        });
    }

这是我的代码,我不知道如何解决这个问题。

3 个答案:

答案 0 :(得分:4)

if (o1.getUseDate() == null || o2.getUseDate() == null)。在这里,您要检查两个Product中的任何一个是否具有空日期。如果他们中的一个确实返回0的结果意味着Comparator将看到它们相等。即使其中只有一个有空日期。在这里,您可能想要进行更深入的检查。以下代码将导致Productnull日期被置于开头。

if(o1.getUseDate() == null && o2.getUseDate() == null)
    return 0; //They are both null, both equal
if(o1.getUseDate() == null && o2.getUseDate() != null)
    return -1; // The first is null and the second is not, return the first as lower than the second
if(o1.getUseDate() != null && o2.getUseDate() == null)
    return 1; //The first is not null and the second is, return the first as higher than the second
else
    return o1.getUseDate().compare(o2.getUseDate()); //Return the actual comparison

这显然有点冗长,但它应该让你知道你应该寻找什么。

答案 1 :(得分:1)

return 0;表示比较元素相等(换句话说,你不应该交换它们)。

如果null s考虑

  • 如果两个值均为0,则返回null(第一个值与第二个值相同 - 不要交换)
  • 如果第一个值为-1但第二个值不为空(第一个元素小于第二个 - 不要交换),则返回null
  • 如果第二个值为1且第一个值不为空(第一个元素大于第二个 - 交换它们),则返回null

答案 2 :(得分:1)

来自compare javadoc:

  

比较其订单的两个参数。返回一个负整数,       零或正整数,因为第一个参数小于,等于       到,或大于第二个。

但是从你的代码行开始:

if (o1.getUseDate() == null || o2.getUseDate() == null) {
   return 0;

我们可以看到你实际上告诉比较器,当至少其中一个是null时,将useDates视为相等,这不是你想要的。

因为null意味着“没有”,所以将没有概念与日期进行比较是很奇怪的,但如果你想允许空值,那么你必须正确处理这种情况,从而产生更多的vorbose代码:

if(o1.getUseDate() == null){
    return o2.getUseDate() == null ? 0 : -1; //or +1 if you want null values at the bottom of your list
}
if(o2.getUseDate() == null){
    return o1.getUseDate() == null ? 0 : -1; // or +1 ...
}
return o1.getUseDate().compare(o2.getUseDate()); // 2 non null dates, do a real comparison