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;
}