我有自定义对象的ArrayList。我需要通过不同的参数来实现排序,即年份和价格的上升和下降。最好的方法是什么?我想在实例化比较器期间实现Comparator并将排序模式传递给构造函数。这是个好主意吗?
答案 0 :(得分:2)
是。自定义Comparator
是一种非常好的方法。
如@Tom和@Puce所述,您可以Comparator
动态reverse the order。
答案 1 :(得分:2)
是的,对于相反的顺序,您可以使用:
答案 2 :(得分:2)
这是一种方式。但是,如果它是一种默认方式,它真的才有意义。请考虑以下Customer类。通常,您始终按名称对客户进行排序。但有时,您希望按信用额度对其进行排序。
为方便起见,实现Comparable是有意义的。至少,您可以使比较器成为类的公共最终组件,以便用户可以轻松访问它们,并且您可以相信它们是由类的作者(或至少具有熟悉的类的工作知识的人)编写的。 )
class Customer implements Comparable<Customer> {
public final Comparator<Customer> byCreditLimit = new Comparator<Customer>() {
public int compare(Customer c1, Customer c2) {
return c1.creditLimit.compareTo(c2.creditLimit);
}
public boolean equals(Object o) {
return o == this;
}
}
private String name;
private BigDecimal creditLimit;
public Customer(String name, BigDecimal creditLimit) {
this.name = name;
this.creditLimit = creditLimit;
}
public boolean equals(Object o) {
if(o instanceof Customer) {
Customer c = Customer(o);
return name.equals(c.name);
}
return false;
}
public int hashCode() {
return name.hashCode();
}
public int compareTo(Customer c) {
return name.compareTo(c.name);
}
}
答案 3 :(得分:2)
我建议每种排序类型使用不同的Comparator
实现。匿名内部类,枚举和Java SE 8(!),lambdas,是实现Comparator
和其他无状态函数类对象的好方法。
您可以使用Collections.reverseOrder转发。
答案 4 :(得分:0)
规范的答案是实现两个比较器 - 一个按升序排序,另一个按降序排序。