【问题标题】:Using Comparable Inteface for sorting both Ascending and Descending使用 Comparable Interface 对升序和降序进行排序
【发布时间】:2016-11-05 05:49:37
【问题描述】:

我的项目中有一个名为 NewsItem 的类。我想根据用户的需要以降序和升序两种方式对 NewsItem 的 ArrayList 进行排序。问题是我正在使用 Comparable 接口,我要么返回一个带有升序条件或降序条件的 int,另一个被注释。如何告诉 Collections.sort() 方法给我升序或降序排序列表。这是我的代码。

@Override
public int compareTo(NewsItem compNews) {
    int compTime=((NewsItem )compNews).getNewsTime();
    /* For Ascending order*/
    return this.NewsTime-compTime;

    /* For Descending order do like this */
    //return compTime-this.NewsTime;
}

现在这里降序一个被评论,所以我可以使用它之一。我可以在此类中使用静态布尔值来使用这些条件之一。但是由于我正在序列化这个类,所以我没有在这个类中使用任何静态变量并且没有这样做。任何帮助表示赞赏。

【问题讨论】:

标签: java android sorting comparable


【解决方案1】:

你的班级应该只有 1 个自然顺序。但这并不意味着您的班级列表应该具有相同的顺序。

当使用Collections.sort 对列表进行排序时,您还可以传递一个比较器来更改此排序方法如何看待您的类。

一个例子:

Collections.sort(yourList, new Comparator<NewsItem>(){
    public void compare(NewsItem o1, NewsItem o2) {
        return o2.compareTo(o1);
    }
});

这指示排序方法与主类中实现的方法相反。

请注意,当 Java 8 为 Android 推出时,您可以改用较短的 Collections.sort(yourList, Comparator.reverseOrder())

【讨论】:

    【解决方案2】:

    完全同意previous answer,但我还有一点要说。对于compare Int's,您可以使用

    Integer.compare(int value1, int value2);
    

    @Override
    public int compareTo(NewsItem compNews) {
        int compTime= ((NewsItem) compNews).getNewsTime();
    
        return Integer.compare(compTime, this.NewsTime);
    }
    

    【讨论】:

      【解决方案3】:

      我不喜欢使用Comparable,因为它需要“自然顺序”。但什么是自然秩序?对于图书管理员,它是按文章编号。对我来说,就是名字。对您来说,这是在创建时间之前。
      因此,“自然秩序”是模棱两可的。

      所以我更倾向于使用Comparator,它明确说明您需要什么(并创建一个 CompareByNewsTimeAscending 和 CompareByNewsTimeDescending 比较器)。

      但是,你也可以做的只是自然地排序,然后将列表倒过来......

      【讨论】:

        【解决方案4】:

        在 java 中,您可以通过让集合的元素都实现 Comparable 接口或实现 Comparator 类来进行排序。

        当您在比较器排序用作default sort order 的集合元素中实现 Comparable 时,因此仅实现 Comparable 您将无法同时获得两种排序顺序。

        我的建议是有两个比较器并使用适当的一个:

        public class AccendingNewsItemComparator implements Comparator<NewsItem> {
            public int compare(NewsItem a, NewsItem b) {
                if (a.getNewsTime() < b.getNewsTime()) return -1;
                if (a.getNewsTime() > b.getNewsTime()) return +1;
                return 0;
            }
        }
        
        public class DescendingNewsItemComparator extends AccendingNewsItemComparator {
            public int compare(NewsItem a, NewsItem b) {
                int result = super.compare(a, b);
                if (result == 0) return 0;
                return -result;
            }
        }
        

        使用两个类,您可以像这样按升序或降序对集合进行排序:

        List<NewsItem> items = ... // collection to sort
        boolean ascendingSort = .... // this will control sort order
        Collections.sort(items, ascendingSort ? new AccendingNewsItemComparator() : new DescendingNewsItemComparator());
        

        【讨论】:

          猜你喜欢
          • 2020-06-06
          • 1970-01-01
          • 2016-10-18
          • 1970-01-01
          • 2017-01-31
          • 2015-08-30
          • 2020-11-09
          • 2016-02-24
          相关资源
          最近更新 更多