繁体   English   中英

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

[英]Using Comparable Inteface for sorting both Ascending and Descending

我的项目中有一个称为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;
}

现在在这里对降序进行注释,以便我可以使用其中之一。 我可以在此类中使用静态布尔值来使用以下条件之一。 但是,由于我正在序列化此类,因此我在此类中未使用任何静态变量,因此请勿这样做。 任何帮助表示赞赏。

您的课程应该只有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())

在java中,您可以通过使collection的元素全部实现Comparable接口或通过实现Comparator类来进行排序。

在集合的元素中实现Comparable时,将比较器的sort用作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;
    }
}

通过两个类,您可以像下面这样对集合进行升序或降序排序:

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

完全同意先前的回答 ,但我还有另外一句话。 为了进行比较,您可以使用

Integer.compare(int value1, int value2);

@Override
public int compareTo(NewsItem compNews) {
    int compTime= ((NewsItem) compNews).getNewsTime();

    return Integer.compare(compTime, this.NewsTime);
}

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

所以我更多的使用Comparator ,其中明确说你需要什么(创建CompareByNewsTimeAscending和CompareByNewsTimeDescending比较)。

但是,您还可以做的就是简单地自然排序,然后反转列表...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM