我有自定义对象的ArrayList。我需要按不同的参数进行排序,即年份和价格都是上升和下降。什么是最好的方式来做到这一点?我想过在实例化比较器期间实现Comparator并将排序模式传递给构造函数。这是个好主意吗?Java比较自定义对象
回答
我建议每个排序类型使用不同的Comparator
实现。在Java SE 8(!)中,匿名内部类,枚举和lambda表达式是实现Comparator
和其他无状态函数类对象的好方法。
您可以用Collections.reverseOrder反转。
是的。自定义Comparator
是一个很好的方法。
正如@Tom和@Puce所提到的那样,您可以在Comparator
上实时运行reverse the order。
这是一种方式。但是,如果它是一种默认方式,它确实是有意义的。考虑以下客户类。通常,您总是按名称对客户进行排序。但有时候,你想按他们的信用额度来排序。
为了方便起见,实施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);
}
}
你能说出为什么Comparable比Comparator更好吗? – 2011-04-27 17:08:20
主要是为了方便。这是一种说法:“大多数情况下,你会对这种类型的对象进行排序,你应该像这样排序。”这只是一件少想的事情。想象一下,你是一个开发人员使用一个类。您希望将对象分类以加快查找速度。开发人员知道,通过对名称进行排序,您应该可以获得相对较好的分配,而按信用额度排序的效率会更低(批次可能具有相同的信用额度,但等于说明Set最多只有一个给定名称)。通过使用Comparable,作者可以提供默认比较机制。 – corsiKa 2011-04-27 17:16:27
如果一个类实现了Comparable,它表明它具有“自然顺序”。好的样品是例如数字类(Integer,Long),它们按包装的数字排序。如果没有“自然顺序”,或者你想要的东西与“自然顺序”不同 - >使用比较器 – Puce 2011-04-27 17:31:38
- 1. 比较自定义对象c#
- 2. 比较2个自定义对象 - C#
- 3. 自定义对象比较器
- 4. java对象比较
- 5. Java,比较对象
- 6. Java PriorityQueue自定义比较器
- 7. Java自定义比较不起作用
- 8. 比较两个对象,java
- 9. 日期对象比较 - Java
- 10. 相等对象比较:JAVA
- 11. 的java org.json比较对象
- 12. 比较xml对象java
- 13. Java:比较对象值
- 14. 比较自定义类型
- 15. DISTINCT与自定义比较
- 16. Groovy自定义比较器
- 17. 自定义比较验证
- 18. 自定义比较的ConcurrentSkipListMap
- 19. 自定义比较器使用单个对象
- 20. 设置自定义函数对象比较器c + +
- 21. jquery-比较基于用户的自定义对象属性Chocie
- 22. STL地图自定义比较函数对象
- 23. Quickblox iOS - 比较自定义对象请求中的日期
- 24. 如何使用java比较器自定义排序/排序json对象?
- 25. IEquatable可以比较具有其他自定义对象的列表属性的自定义对象吗?
- 26. Java中的抽象对象比较
- 27. 比较对象
- 28. 比较对象
- 29. 比较对象
- 30. 比较对象
每种排序类型都有一个自定义的“比较器”,但是与“Collections.reverseOrder”相反:http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#reverseOrder(java .util.Comparator) – 2011-04-27 17:00:47