【问题标题】:compare and sort different type of objects using java Collections使用 java Collections 比较和排序不同类型的对象
【发布时间】:2011-04-20 05:35:58
【问题描述】:

如何使用 java Collections 比较和排序不同类型的对象。下面是用例: 例如 DOG、MAN、TREE、COMPUTER、MACHINE - 所有这些不同的对象都有一个共同的属性,比如“int lifeTime”。现在我想根据 lifeTime 属性订购这些对象

谢谢

【问题讨论】:

    标签: java sorting collections


    【解决方案1】:

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

    public interface Living {
        int getLifeTime();
    }
    

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

    List<Alive> sortedLivings = sort(livings, on(Alive.class).getLifeTime());
    

    【讨论】:

    • 我知道这个名字听起来很熟悉。这个问题让我觉得,目前还没有解决方案可以在 lambdaj 中反转给定迭代中的元素顺序(或按自然顺序/比较器的倒数排序)。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      所有这些对象都应该有一个公共抽象类/接口,例如Alive 和一个方法getLifeTime(),您可以拥有Alive 扩展Comparable&lt;Alive&gt; 或创建自己的Comparator&lt;Alive&gt;

      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&lt;Alive&gt;) 或使用 Collections.sort()List&lt;Alive&gt; 进行排序。


      资源:

      【讨论】:

      • 如果你实现Alive.compareTo,你应该正确实现它,即真正比较两个对象的生命周期而不是返回0。否则你需要在每个具体子类中(基本上是重复的)实现。
      • @Péter Török,我还没有完成实施,因为我不知道想要的顺序。而且您实际上不必在每个子类中都重写它,这就是我在第一部分使用抽象类而不是接口的原因,也是我在return 0 行留下这么长的评论的原因。
      • 对不起,您的代码注释对此不清楚(至少对我而言);这就是为什么我认为最好添加澄清评论:-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      相关资源
      最近更新 更多