Java 使用可比较的接口进行升序和降序排序
我的项目中有一个名为NewsItem的类。我想根据用户的需要,以降序和升序两种方式对新闻项的ArrayList进行排序。问题是我使用的是Comparable接口,我要么返回一个带升序条件的int,要么返回降序条件的int,另一个被注释。如何让Collections.sort方法给出升序或降序排序列表。这是我的密码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
@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());