【问题标题】:combine compartors into a single class将比较器组合成一个类
【发布时间】:2013-05-28 01:37:09
【问题描述】:

我正在使用几个比较器将对象的 ArrayList 排序为降序或升序。目前,这些比较器属于不同的类别。如何将以下比较器组合成一个类?

class ascendingSortComparator implements Comparator<Movie> { //sort movie ascending

    @Override
    public int compare(Movie movie1, Movie movie2) {
        return movie1.getTitle().compareTo(movie2.getTitle());
    }
}

class descendingSortComparator implements Comparator<Movie> { //sort movie ascending

    @Override
    public int compare(Movie movie1, Movie movie2) {
        return -movie1.getTitle().compareTo(movie2.getTitle());
    }
}

如果可能的话,我将如何调用适当的比较器。目前我这样称呼它:

public void sortData() {
    String option = (String) sortComboBox.getSelectedItem();

    if ("Ascending".equals(option)) {
        Collections.sort(movieCatalog, new ascendingSortComparator());
        //indexCount = (movieCatalog.size()-1) - indexCount;
        //displayData(indexCount);
    }

    if ("Descending".equals(option)) {
        Collections.sort(movieCatalog, new descendingSortComparator());
        //indexCount = (movieCatalog.size()-1) - indexCount;
        //displayData(indexCount);
    }
}

【问题讨论】:

    标签: java oop sorting arraylist comparator


    【解决方案1】:

    我相信编写一个比较器工厂是个好主意。尝试查看此示例或尝试 google 了解更多信息:

    http://some-technical-stuff.blogspot.in/

    【讨论】:

      【解决方案2】:

      您可以将电影保存在TreeSet(或TreeMap)而不是List 中,并且它们在插入时排序(您将Comparator 作为构造函数的参数)。获取反转片,只需拨打Collections.reverse()

      【讨论】:

        【解决方案3】:

        您可以使用方法Comparator&lt;T&gt; Collections.reverseOrder(Comparator&lt;T&gt;)

        另外我建议不要每次都创建新的Comparator,而是分配一次然后存储。

        如果您需要更复杂的比较器,Guava 的 Ordering 类可能会很有用:Ordering explained

        【讨论】:

          【解决方案4】:

          我会使用枚举

          public enum MovieComparator implement Comparator<Movie> {
              ASCENDING { //sort movie ascending
                  public int compare(Movie movie1, Movie movie2) {
                      return movie1.getTitle().compareTo(movie2.getTitle());
                  }
              }, DECENDING { 
                  public int compare(Movie movie1, Movie movie2) {
                      return movie2.getTitle().compareTo(movie1.getTitle());
                  }
              }
          }
          
          public void sortData() {
              String option = (String) sortComboBox.getSelectedItem();
              MovieComparator cmp = MovieComparator.valueOf(option.toUpperCase());
              Collections.sort(movieCatalog, cmp);
          }
          

          【讨论】:

          • 严格来说:共有三个类:MovieComparator 和两个匿名类。但我认为这是尽可能接近的。
          • 它们都可以出现在一个 Java 文件中,而实现意味着如你所说的多个 .class 文件,我认为这是最接近 OP 想要的。
          猜你喜欢
          • 1970-01-01
          • 2022-06-25
          • 1970-01-01
          • 2013-02-25
          • 2020-03-24
          • 2013-05-17
          • 1970-01-01
          • 2012-05-10
          • 2021-01-16
          相关资源
          最近更新 更多