我正在尝试对 Android 应用程序的回收 View 中显示的对象列表(称为提醒)进行排序。我正在使用自定义比较器来比较对象的 int 类型变量之一。
我已经设法使用另一个变量(日期)对对象列表进行排序。我制作的自定义比较器与 Date 对象配合得很好。
这是我用来使用整数变量对对象进行排序的比较器,在本例中这是对象的“优先级”。
public void sortByPriority(){
Collections.sort(reminderList, new Comparator<Reminder>() {
@Override
public int compare(Reminder o1, Reminder o2) {
return o1.getPriority() - o2.getPriority();
}
});
reminderAdapter.notifyDataSetChanged();
}
布局上有一个按钮调用上面的 sortByPriority() 方法。单击时实际上会进行一些排序操作,但结果在列表或回收器 View 中不一致。
例如,初始数据集是这样的(优先级取值范围为1到4,优先级属于提醒类)
(初始数据:4,1,1,4,2,3,2,1,1,2)
(使用上述比较器排序:1,1,1,2,2,4,1,2,3,4)
看起来它即将正常工作,但中间发生了一些事情。 (顺便说一下,我希望它们按降序排列)
我是个新手,所以我可能会搞砸。非常感谢您的帮助。
最佳答案
compare 方法基本上告诉我们传递的参数中哪个更大。
在您的示例中,如果函数返回正数,则意味着 o1
更大,如果 0
则意味着它们相等。如果为负,则 o2
更大。
public int compare(Reminder o1, Reminder o2) {
return o1.getPriority() - o2.getPriority();
}
如果您希望它们按降序排列,可以通过两种方式实现。首先是反转 compare
方法逻辑。
public int compare(Reminder o1, Reminder o2) {
// o2 - o1 instead of o1 - o2
return o2.getPriority() - o1.getPriority();
}
另一种方法是在对列表进行排序后使用Collections.reverseOrder()
。
Collections.sort(reminderList, Collections.reverseOrder());
对于不正确的值,您能否结合上述逻辑再次检查一下您的数据。
关于java - 如何解决对对象列表进行排序时自定义比较器的意外行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55485011/