我的项目中有一个名为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;
}
现在这里有一个评论,所以我可以使用其中之一。我可以在这个类中使用静态布尔值来使用这些条件之一。但是因为我正在序列化这个类,所以我没有在这个类中使用任何静态变量,并且没有这样做。任何帮助表示赞赏。
答案 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比较器)。
然而,您还可以做的只是自然地订购它,然后反转列表......