使用 Comparable 接口对升序和降序进行排序

Using Comparable Inteface for sorting both Ascending and Descending

我的项目中有一个名为 NewsItem 的 class。我想根据用户需要以降序和升序两种方式对 NewsItem 的 ArrayList 进行排序。问题是我正在使用 Comparable 接口,我 return 一个具有升序条件或降序条件的 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;
}

现在这里对降序进行了评论,因此我可以使用其中之一。我可以在此 class 中使用静态布尔值来使用这些条件之一。但是因为我正在序列化这个 class,所以我没有在这个 class 中使用任何静态变量并且没有这样做。感谢任何帮助。

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

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

一个例子:

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

这指示排序方法执行与主要 class 中实现的方法相反的操作。

请注意,当 Java 8 出现在 android 时,您可以使用较短的 Collections.sort(yourList, Comparator.reverseOrder())

完全同意, but I have one more remark. For 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);
}

我不喜欢使用 Comparable,因为它需要 'natural order'。但什么是自然秩序?对于图书管理员来说,这是按文章编号。对我来说,这是名字。对你来说,是按创建时间。
因此,'natural order' 是不明确的。

所以我更喜欢使用 Comparator 明确说明您需要什么(并创建 CompareByNewsTimeAscending 和 CompareByNewsTimeDescending 比较器)。

然而,你也可以做的是简单地自然排序,然后反转列表...

在 java 中,您可以通过让 collection 的元素全部实现 Comparable 接口,或者通过实现 Comparator class.

来排序

当您在 collection 的元素中实现 Comparable 时,比较器排序用作 default sort order,因此仅实现 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;
    }
}

使用两个 classes,您可以像这样对 collection 进行升序或降序排序:

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