【发布时间】:2014-05-20 07:07:27
【问题描述】:
我正在使用 Java Comparator 根据该对象中的某个值对我的对象之一进行排序,如下所示:
@Override
public int compare(Event e1, Event e2) {
if(sortOrder.equalsIgnoreCase(DESCENDING))
return compareTo(e2, e1);
else
return compareTo(e1, e2);
}
public int compareTo(Event e1, Event e2) {
Tag t1 = getTag(e1, tagName, tagType);
Tag t2 = getTag(e2, tagName, tagType);
if(t1!=null && t2!=null){
if(t1.getRank()==null && t2.getRank()!=null)
return 1;
else if(t2.getRank()==null && t1.getRank()!=null)
return -1;
else if (t1.getRank() < t2.getRank())
return -1;
else if (t1.getRank() > t2.getRank())
return 1;
else
return e1.getId().compareTo(e2.getId()); //If rank null or equal compute rank based on id.
}
return 0;
}
Tag getTag(Event e, String tagName, TagTypeEnum tagType){
List<Tag> tags = e.getTags();
for(CTagsDO tag: tags){
if((tag.getType().getId() == tagType.getId()) && (tag.getName().equals(tagName)))
return tag;
}
return null;
}
在这里,我比较了来自 2 个事件的 2 个标签,这些标签具有一定的排名值。我根据标签对象中的这个排名对我的事件进行排序。
升序排列效果很好,它将排名值最低的事件放在排名较高的事件之后,并将排名值为空的所有事件放在最后。
但是对于 DESCENDING 顺序,由于我只是做一个倒置的 ASCENDING 顺序,它将所有排名为空的事件放在顶部,然后从排名最高的事件开始,然后移动到最低排名。
在 DESCENDING 排序中,如何先获取排名最高的事件,然后是排名较低的事件,最后排名为空的事件?
【问题讨论】:
-
只按一种顺序排序(比如升序),然后调用 Collections.reverse() 会将其更改为降序。不要重新发明轮子:)
-
我可以建议你使用 Guava 来构建你的
Comparator吗?它的订购设施非常好。 code.google.com/p/guava-libraries/wiki/OrderingExplained 它包括漂亮的nullsFirst和nullsLast方法。 -
@WhoAmI - 这正是 OP 所说的他们不想要的。
标签: java sorting comparator comparable