如何在排序对象列表时解决自定义比较器的意外行为?

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());

对于不正确的值,您可以考虑上述逻辑再次检查您的数据。

以上是关于如何在排序对象列表时解决自定义比较器的意外行为?的主要内容,如果未能解决你的问题,请参考以下文章

Java 8:按属性对对象列表进行排序,无需自定义比较器

将对象列表与自定义键进行比较

用于对包含指向自定义类对象的指针的向量进行排序的比较器

sort方法和自定义比较器的写法

Arrays.sort在char数组自定义排序出现意外

python类与对象-如何让类支持比较操作