使用Comparable Inteface对Ascending和Descending进行排序

时间:2016-07-03 09:52:31

标签: java android sorting comparable

我的项目中有一个名为NewsItem的类。我想按照用户想要的方式对Descending和Ascending两种方式对NewsItem的ArrayList进行排序。问题是我正在使用Comparable接口,我要么返回一个具有升序条件或降序条件的int,另一个则被注释掉。如何告诉Collections.sort()方法为我提供Ascending或Descending sorted List。这是我的代码。

@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;
}

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

4 个答案:

答案 0 :(得分:4)

你的班级应该只有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())代替。

答案 1 :(得分:4)

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

当你在集合元素中实现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;
    }
}

使用两个课程,您可以将您的收藏分类为升序或降序:

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

答案 2 :(得分:0)

完全赞同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 :(得分:0)

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

所以我更倾向于使用明确说出你需要的Comparator(并创建一个CompareByNewsTimeAscending和CompareByNewsTimeDescending比较器)。

然而,您还可以做的只是自然地订购它,然后反转列表......