Java比较自定义对象

时间:2011-04-27 16:54:36

标签: java

我有自定义对象的ArrayList。我需要通过不同的参数来实现排序,即年份和价格的上升和下降。最好的方法是什么?我想在实例化比较器期间实现Comparator并将排序模式传递给构造函数。这是个好主意吗?

5 个答案:

答案 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)

规范的答案是实现两个比较器 - 一个按升序排序,另一个按降序排序。