基于多个标准对列表进行排序

时间:2011-10-14 18:00:50

标签: java

我想根据多个标准对列表进行排序。

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

3 个答案:

答案 0 :(得分:3)

Java的Arrays.sortCollections.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)

中使用该比较器