2011-04-27 40 views
1

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

回答

2

我建议每个排序类型使用不同的Comparator实现。在Java SE 8(!)中,匿名内部类,枚举和lambda表达式是实现Comparator和其他无状态函数类对象的好方法。

您可以用Collections.reverseOrder反转。

2

是的。自定义Comparator是一个很好的方法。

正如@Tom和@Puce所提到的那样,您可以在Comparator上实时运行reverse the order

+2

每种排序类型都有一个自定义的“比较器”,但是与“Collections.reverseOrder”相反:http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#reverseOrder(java .util.Comparator) – 2011-04-27 17:00:47

0

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

+3

使用Collections.reverseOrder – Puce 2011-04-27 17:01:32

+0

@Puce - 好点。 – CPerkins 2011-04-27 17:20:30

2

这是一种方式。但是,如果它是一种默认方式,它确实是有意义的。考虑以下客户类。通常,您总是按名称对客户进行排序。但有时候,你想按他们的信用额度来排序。

为了方便起见,实施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); 
    } 
} 
+0

你能说出为什么Comparable比Comparator更好吗? – 2011-04-27 17:08:20

+2

主要是为了方便。这是一种说法:“大多数情况下,你会对这种类型的对象进行排序,你应该像这样排序。”这只是一件少想的事情。想象一下,你是一个开发人员使用一个类。您希望将对象分类以加快查找速度。开发人员知道,通过对名称进行排序,您应该可以获得相对较好的分配,而按信用额度排序的效率会更低(批次可能具有相同的信用额度,但等于说明Set最多只有一个给定名称)。通过使用Comparable,作者可以提供默认比较机制。 – corsiKa 2011-04-27 17:16:27

+1

如果一个类实现了Comparable,它表明它具有“自然顺序”。好的样品是例如数字类(Integer,Long),它们按包装的数字排序。如果没有“自然顺序”,或者你想要的东西与“自然顺序”不同 - >使用比较器 – Puce 2011-04-27 17:31:38