使用java集合比较和排序不同类型的对象

使用java集合比较和排序不同类型的对象,java,sorting,collections,Java,Sorting,Collections,如何使用java集合比较和排序不同类型的对象。下面是使用案例: 例如狗、人、树、计算机、机器——所有这些不同的对象都有一个共同的属性,比如“int life”。现在,我想根据lifeTime属性对这些对象进行排序 Thx所有这些对象都应该有一个通用的抽象类/接口,比如活动的和方法getlife(),并且您可以使用活动的扩展来进行比较 最简单的方法是让所有类都实现一个接口或扩展一个基类,该基类公开用于比较的公共属性(生存期)。否则,您可以创建一个比较器,该比较器使用反射来获取生存期属性,并在比

如何使用java集合比较和排序不同类型的对象。下面是使用案例: 例如狗、人、树、计算机、机器——所有这些不同的对象都有一个共同的属性,比如“int life”。现在,我想根据lifeTime属性对这些对象进行排序


Thx

所有这些对象都应该有一个通用的抽象类/接口,比如
活动的
和方法
getlife()
,并且您可以使用
活动的
扩展
来进行比较

    • 最简单的方法是让所有类都实现一个接口或扩展一个基类,该基类公开用于比较的公共属性(生存期)。否则,您可以创建一个
      比较器
      ,该比较器使用反射来获取生存期属性,并在比较器的比较方法中使用该值。当然,如果您的集合包含一个没有生存期属性的对象,这将引发异常。

      如果您的所有类都实现了如下定义的活动接口(在Java中总是一个好主意):

      您可以使用库对活体对象集合进行排序,如下所示:

      List<Alive> sortedLivings = sort(livings, on(Alive.class).getLifeTime());
      
      List sortedLivings=sort(livings,on(Alive.class).getLifeTime());
      
      如果实现
      活动。比较到
      ,则应正确实现,即真正比较两个对象的生存期,而不是返回0。否则,在每个具体的子类中都需要一个(基本上是重复的)实现。@Péter Török,我没有完成实现,因为我不知道想要的顺序。您不必在每个子类中都重写它,这就是我在第一部分使用抽象类而不是接口的原因,也是我在
      返回0
      行上留下这么长注释的原因。对不起,您的代码注释对此不清楚(至少对我而言);这就是为什么我认为最好添加一条澄清的评论:-)我知道这个名字听起来很熟悉。这个问题让我想到,目前还没有在lambdaj中反转给定iterable中的元素顺序(或通过自然顺序/比较器的倒数排序)的解决方案。
      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
          }
      }
      
      public interface Living {
          int getLifeTime();
      }
      
      List<Alive> sortedLivings = sort(livings, on(Alive.class).getLifeTime());