Я использую Java компаратор для сортировки одного моего объекта, основываясь на некотором значении в этом объекте, как показано ниже:Java компаратор сортировки
@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-х событий, которые имеют некоторый ранг значения. Я сортирую свои события на основе этого ранга внутри объекта тега.
Порядок ASCENDING хорошо работает там, где он помещает события с наименьшими значениями ранга, за которыми следуют события с более высокими рангами, и помещает все события с нулевыми значениями рангов в конце.
Но для заказа DESCENDING, так как я просто делаю инвертированный порядок ASCENDING, он помещает все события с нулевыми значениями рангов вверху, а затем начинается с событий с наивысшими рангами и переходит к самым низким рангам.
В DESCENDING sort, как мне получить события с наивысшими рангами, а затем нижние разряды, а затем с нулевым значением для рангов в конце?
Сортировка только в одном порядке (скажем, ASCENDING), а затем вызов Collections.reverse() изменит его на убывающий порядок. Не заново изобретайте колесо :) – TheLostMind
Могу ли я предложить вам использовать Guava для создания своего «компаратора»? Его заказывающие объекты довольно приятные. https://code.google.com/p/guava-libraries/wiki/OrderingExplained. Он включает в себя отличные методы «nullsFirst» и «nullsLast». –
@WhoAmI - это именно то, что OP сказал, что они НЕ хотят. –