【问题标题】:Using Comparable Inteface for sorting both Ascending and Descending使用 Comparable Interface 对升序和降序进行排序
【发布时间】:2016-11-05 05:49:37
【问题描述】:
我的项目中有一个名为 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;
}
现在这里降序一个被评论,所以我可以使用它之一。我可以在此类中使用静态布尔值来使用这些条件之一。但是由于我正在序列化这个类,所以我没有在这个类中使用任何静态变量并且没有这样做。任何帮助表示赞赏。
【问题讨论】:
标签:
java
android
sorting
comparable
【解决方案1】:
你的班级应该只有 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())。
【解决方案2】:
完全同意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】:
我不喜欢使用Comparable,因为它需要“自然顺序”。但什么是自然秩序?对于图书管理员,它是按文章编号。对我来说,就是名字。对您来说,这是在创建时间之前。
因此,“自然秩序”是模棱两可的。
所以我更倾向于使用Comparator,它明确说明您需要什么(并创建一个 CompareByNewsTimeAscending 和 CompareByNewsTimeDescending 比较器)。
但是,你也可以做的只是自然地排序,然后将列表倒过来......
【解决方案4】:
在 java 中,您可以通过让集合的元素都实现 Comparable 接口或实现 Comparator 类来进行排序。
当您在比较器排序用作default sort order 的集合元素中实现 Comparable 时,因此仅实现 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());