如何在排序对象列表时解决自定义比较器的意外行为?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在排序对象列表时解决自定义比较器的意外行为?相关的知识,希望对你有一定的参考价值。
我正在尝试对一个对象列表(称为提醒)进行排序,这些对象显示在我的android应用程序的recyclerview中。我使用自定义比较器来比较Object的一个变量,它是一个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()方法。单击时,它实际上执行了一些排序操作,但结果在列表或recyclerview中不一致。
例如,初始数据集是这样的(优先级值范围从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());
对于不正确的值,您可以考虑上述逻辑再次检查您的数据。
以上是关于如何在排序对象列表时解决自定义比较器的意外行为?的主要内容,如果未能解决你的问题,请参考以下文章