Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用可比较的接口进行升序和降序排序_Java_Android_Sorting_Comparable - Fatal编程技术网

Java 使用可比较的接口进行升序和降序排序

Java 使用可比较的接口进行升序和降序排序,java,android,sorting,comparable,Java,Android,Sorting,Comparable,我的项目中有一个名为NewsItem的类。我想根据用户的需要,以降序和升序两种方式对新闻项的ArrayList进行排序。问题是我使用的是Comparable接口,我要么返回一个带升序条件的int,要么返回降序条件的int,另一个被注释。如何让Collections.sort方法给出升序或降序排序列表。这是我的密码 @Override public int compareTo(NewsItem compNews) { int compTime=((NewsItem )compNews).g

我的项目中有一个名为NewsItem的类。我想根据用户的需要,以降序和升序两种方式对新闻项的ArrayList进行排序。问题是我使用的是Comparable接口,我要么返回一个带升序条件的int,要么返回降序条件的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;
}

现在这里有一个注释,所以我可以使用其中的一个。我可以在这个类中使用静态布尔值来使用这些条件之一。但是,由于我正在序列化这个类,所以我没有在这个类中使用任何静态变量,也没有这样做。非常感谢您的帮助。

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

使用Collections.sort对列表进行排序时,还可以传递一个比较器,该比较器会更改此排序方法对类的看法

例如:

Collections.sort(yourList, new Comparator<NewsItem>(){
    public void compare(NewsItem o1, NewsItem o2) {
        return o2.compareTo(o1);
    }
});
这指示排序方法执行与在主类中实现的方法相反的操作

请注意,当Java 8用于android时,您可以使用较短的Collections.sortyourList、Comparator.reverseOrder来代替。

完全同意,但我还有一句话要说。因为你可以用

Integer.compare(int value1, int value2);
我不喜欢使用Comparable,因为它需要“自然顺序”。但什么是自然秩序?对于图书管理员来说,这是根据文章编号来确定的。对我来说,这是名字。对你来说,这是创造时间。 因此,“自然秩序”是模棱两可的

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


然而,您也可以简单地自然地对其排序,然后颠倒列表…

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

在集合元素中实现Comparable时,comparators sort用作默认排序顺序,因此仅实现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());
类似:。
List<NewsItem> items = ... // collection to sort
boolean ascendingSort = .... // this will control sort order
Collections.sort(items, ascendingSort ? new AccendingNewsItemComparator() : new DescendingNewsItemComparator());