如何根据优先级重新排列列表视图中的项目?

Posted

技术标签:

【中文标题】如何根据优先级重新排列列表视图中的项目?【英文标题】:How to rearrange items in a list view according to their priority? 【发布时间】:2021-10-05 02:18:24 【问题描述】:

我正在开发一个任务应用程序,我正在尝试设置一个列表视图。现在,我有点初学者,所以我想问你如何将我的想法实现为代码......

用户输入任务,并告诉我各个任务的优先级和花费的时间。现在,一旦用户输入所有数据,我想编写代码,按照优先级降低和时间增加的顺序重新排列所有数据。例如,一个具有高优先级但花费较少时间的任务必须列在第一位,依此类推……我尝试使用列表项的索引来做一些事情,但效果不佳。有什么办法可以解决这个问题吗?谢谢。

【问题讨论】:

如果您对列表的数据集进行排序,那么列表应该/将被更新。你试过什么,代码是什么?你看到了什么行为? 我尝试使用大量 if-else 语句...例如,如果(优先级高),然后是它的组合...但是我自己查看所有可能的组合是不可能的,因为大约有 3 ! em 这是一个编程站点,因此,我们希望能够看到您的代码以提供帮助。你累了什么?使用 Comparator 进行比较,对数据集进行排序似乎就足够了 @Bonatti 是的,我明白了。我能够做到。我没有使用优先队列,比较器工作得很好。我创建了一个自定义的...我现在将发布答案 【参考方案1】:

你不需要写那样的东西。查看PriorityQueue,它就是这样做的:

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/PriorityQueue.html

该类实现了Iterator 接口,因此如果您不仅需要列表中最重要的元素,您还可以访问特定元素。

如果您需要更复杂的优先级比较,您可以使用自定义 compare 方法实现 Comparator

https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html

这应该提供您需要的所有功能。

【讨论】:

对。我想我会尝试 Priority queue ,因为它与我想要的非常匹配【参考方案2】:

使用自定义比较器效果很好。我想出了一个简单的算法,它涉及将简单的整数(如 10、9 和 8)分别分配给优先级高、中和低,并将 1、2 和 3 分配给时间。比较器只是从优先级中减去时间并将其用作比较参数。效果很好。这是比较器类的代码:

package com.example.taskmasterv3;

import java.util.Comparator;

public class TaskComparator implements Comparator<SubtaskPartTwo> 

    public int compare(SubtaskPartTwo s1, SubtaskPartTwo s2)

        int a = s1.getPri() - s1.getTime();
        int b = s2.getPri() - s2.getTime();
        int x = s1.getPri();
        int y = s2.getPri();

        if (b == a)

            return y-x;

        
        else 
            return b-a;
        

    

在 List Adapter 类中使用以下代码行使其工作:

// THIS IS WHERE I USE SORT
        Collections.sort(values, new TaskComparator());

【讨论】:

【参考方案3】:

想出一个执行排序的公式,例如

(((p / 2) * 100) * p)  + ((t / 2) * 100) * t) 
p - 优先级 t - 时间

在示例中,优先级和时间具有相同的权重。

【讨论】:

不确定我能否正确理解公式...,抱歉。

以上是关于如何根据优先级重新排列列表视图中的项目?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 - 重新排列并保留表格视图中的单元格

如何重新排列 UILocalNotification 表格视图的单元格?

重新排列表格视图单元格后如何更新核心数据记录

PyQt QListView 拖放问题,用于在一个列表中导入和重新排列

如何在刷新表视图之前获取视图模型中的存储库列表?

如何通过单击适配器类中代码的项目中的删除按钮来删除列表视图中的项目后重新加载片段?