我试图按照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());
}
}
});
}
这是我的代码,我不知道如何解决这个问题。
答案 0 :(得分:4)
if (o1.getUseDate() == null || o2.getUseDate() == null)
。在这里,您要检查两个Product
中的任何一个是否具有空日期。如果他们中的一个确实返回0
的结果意味着Comparator
将看到它们相等。即使其中只有一个有空日期。在这里,您可能想要进行更深入的检查。以下代码将导致Product
在null
日期被置于开头。
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