我想根据多个标准对列表进行排序。
public class CustomerComparator implements Comparator<Customer> {
public int compare(Customer customer1, Customer customer2) {
int comparison = -1;
comparison = customer2.getCustomerPriority().compareTo(customer1.getCustomerPriority());
if( comparison == 0 ) {
comparison = customer1.getCustomerNumber().compareTo(customer2.getCustomerNumber());
}
return comparison;
}
}
基本上,我想按照以下顺序排序。具有较高优先级的客户应位于列表的顶部,如果两个客户的优先级高于客户编号较低的客户,则应优先考虑。
原件:
Customer Priority
1 0
2 0
3 1
4 0
5 0
应按如下方式排序:
Customer Priority
3 1
1 0
2 0
4 0
5 0
感谢您的帮助。 DD
答案 0 :(得分:3)
Java的Arrays.sort
和Collections.sort
都是稳定的排序算法,这意味着您可以使用一个比较器进行排序,然后使用另一个比较器进行排序,而第二个被认为等效的值仍将按第一个排序。 / p>
看起来你已经将两个比较器组合成了一个,所以只需将其传递给the version of sort
that takes a comparator:
这种保证是稳定的:相同的元素不会因排序而重新排序。
使用n个不同的比较器进行排序,
public static <T> void sort(Collection<T> c, Comparator<? super T>... cmps) {
for (Comparator<? super T> cmp : cmps) { Collections.sort(c, cmp); }
}
应该在功能上等同于使用那些比较器的组合进行一次排序
public static <T> void sort(Collection<T> c, Comparator<? super T>... cmps) {
Collections.sort(c, new Comparator<T>() {
public int compare(T a, T b) {
for (int i = cmps.length; --i >= 0;) {
int delta = cmps[i].compare(a, b);
if (delta != 0) { return delta; }
}
return 0;
}
});
}
答案 1 :(得分:2)
您可以在比较器中编写比较方法,如下所示,并将其传递给树集。我假设客户编号是唯一的,因为set不允许重复。
public int compare(Customer c1, Customer c2)
{
int i = c1.getPriority().compareTo(c2.getPriority());
if (i != 0) return i;
i = c1.getNumber().compareTo(c2.getNumber());
if (i != 0) return i;
return -1;
}
答案 2 :(得分:1)
好吧,在Collections.sort(list, comparator)