【发布时间】:2011-04-20 05:35:58
【问题描述】:
如何使用 java Collections 比较和排序不同类型的对象。下面是用例: 例如 DOG、MAN、TREE、COMPUTER、MACHINE - 所有这些不同的对象都有一个共同的属性,比如“int lifeTime”。现在我想根据 lifeTime 属性订购这些对象
谢谢
【问题讨论】:
标签: java sorting collections
如何使用 java Collections 比较和排序不同类型的对象。下面是用例: 例如 DOG、MAN、TREE、COMPUTER、MACHINE - 所有这些不同的对象都有一个共同的属性,比如“int lifeTime”。现在我想根据 lifeTime 属性订购这些对象
谢谢
【问题讨论】:
标签: java sorting collections
如果您的所有类都实现了如下定义的 Living 接口(在 Java 中总是一个好主意):
public interface Living {
int getLifeTime();
}
您可以使用 lambdaj 库对您的 Living 对象集合进行排序,如下所示:
List<Alive> sortedLivings = sort(livings, on(Alive.class).getLifeTime());
【讨论】:
最简单的方法是让您的类都实现一个接口或扩展一个基类,这些基类公开用于比较的公共属性 (lifeTime)。否则,您可以创建一个Comparator,它使用反射来获取 lifeTime 属性,并在比较器的比较方法中使用该值。当然,如果您的集合曾经包含一个没有 lifeTime 属性的对象,这将引发异常。
【讨论】:
所有这些对象都应该有一个公共抽象类/接口,例如Alive 和一个方法getLifeTime(),您可以拥有Alive 扩展Comparable<Alive> 或创建自己的Comparator<Alive>。
public abstract class Alive extends Comparable<Alive>{
public abstract int getLifeTime();
public int compareTo(Alive alive){
return 0; // Or a negative number or a positive one based on the getLifeTime() method
}
}
或者
public interface Alive {
int getLifeTime();
}
public class AliveComparator implements Comparator<Alive>{
public int compare(Alive alive1, Alive alive2){
return 0; // Or a negative number or a positive one based on the getLifeTime() method
}
}
之后,下一步是使用自动排序的集合 (TreeSet<Alive>) 或使用 Collections.sort() 对 List<Alive> 进行排序。
资源:
【讨论】:
Alive.compareTo,你应该正确实现它,即真正比较两个对象的生命周期而不是返回0。否则你需要在每个具体子类中(基本上是重复的)实现。
return 0 行留下这么长的评论的原因。