Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于多个条件的排序列表_Java - Fatal编程技术网

Java 基于多个条件的排序列表

Java 基于多个条件的排序列表,java,Java,我想根据多个标准对列表进行排序 public class CustomerComparator implements Comparator<Customer> { public int compare(Customer customer1, Customer customer2) { int comparison = -1; comparison = customer2.getCustomerPriority().compareTo(cust

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

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
3          1
1          0
2          0
4          0
5          0
谢谢你的帮助。
DD

那么,在
集合中使用该比较器。sort(list,comparator)
Java的
数组。sort
集合。sort
都是稳定的排序算法,这意味着您可以使用一个比较器进行排序,然后再使用另一个比较器进行排序,第二个被认为相等的值仍将被第一个排序

看起来您已经将两个比较器组合为一个,因此只需将其传递给:

这种排序保证是稳定的:相等的元素不会因排序而重新排序

用n个不同的比较器串联排序

public static <T> void sort(Collection<T> c, Comparator<? super T>... cmps) {
  for (Comparator<? super T> cmp : cmps) { Collections.sort(c, cmp); }
}

publicstaticvoidsort(Collection c,Comparator您可以在您的Comparator中编写比较方法,如下所示,并将其传递给treeset。我假设客户编号是唯一的,因为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;
}

你好,迈克,谢谢你的回复。但是你能详细解释一下“用一个比较器排序,然后用另一个比较器排序”是什么意思吗?通过附加的代码spinet,我得到以下结果:(客户,优先级)->(3,1)(5,0)(2,0)(1,0)(4,0)。谢谢。我仍然感到困惑。我想,我首先需要更好地了解使用哪种数据结构。我想创建一个每次添加新元素时都会自动排序的数据结构。经过阅读和实验,我发现优先级队列不是最佳解决方案。我将使用TreeSet进行实验,但同时您会怎么做建议?
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;
    }
  });
}
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;
}