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

标签 java android sorting android-recyclerview

我正在尝试对 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/

相关文章:

android - 从 API23 移除 Apache HTTP 客户端,这会对 Volley 产生影响吗?

algorithm - 如何对可变长度的大句子文件进行排序?

algorithm - 查找路径是一个大部分为空的加权网格

java - cpp - 调用基于枚举的函数? (解释或等效的java)

java - 如何删除重复值然后显示唯一值?

java - 从文件中快速读取小端整数

java - 登录后添加 header 拦截器 - Retrofit

android - 多个dex文件定义Landroid/support/v4/content/res/TypedArrayUtils

android - 无法在多行编辑文本框中输入新行(输入按钮会将焦点更改为下一个输入字段)

c# - 按升序或降序对数字或字母进行通用排序