[英]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());
我不喜欢使用Comparable
因为它需要“自然顺序”。 但是什么是自然秩序? 对于图书馆员来说,是按商品编号。 对我来说,这是名字。 对您来说,这是在创建时间。
因此,“自然秩序”是模棱两可的。
所以我更多的使用Comparator
,其中明确说你需要什么(创建CompareByNewsTimeAscending和CompareByNewsTimeDescending比较)。
但是,您还可以做的就是简单地自然排序,然后反转列表...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.