android - 使用优先级 id 和日期时间对列表模型进行排序
问题描述
样品清单
ArrayList<MyObject> list = new ArrayList<MyObject>();
list.add(new MyObject (1, "2011-04-27T09:40:01.607"));
list.add(new MyObject (1, "2011-05-27T09:42:01.607"));
list.add(new MyObject (2, "2011-06-27T09:42:01.607"));
list.add(new MyObject (5, "2011-07-27T09:43:01.607"));
list.add(new MyObject (6, "2011-08-27T09:44:01.607"));
list.add(new MyObject (6, "2011-09-27T09:45:01.607"));
list.add(new MyObject (1, "2011-10-27T09:46:01.607"));
1:-如何根据 ID 对 ArrayList 进行排序
所需输出
list.get(0)= (1, "2011-04-27T09:40:01.607"));
list.get(1)=(1, "2011-05-27T09:42:01.607"));
list.get(2)= (1, "2011-10-27T09:46:01.607"));
list.get(3)=(2, "2011-06-27T09:42:01.607"));
list.get(4)=(5, "2011-07-27T09:43:01.607"));
list.get(5)=(6, "2011-08-27T09:44:01.607"));
list.get(6)=(6, "2011-09-27T09:45:01.607"));
2:-当id排序时,每组id根据其日期排序
表示 id (1) 存在 3 次,因此 id (1) 根据其日期排序
所需输出
list.get(0)= (1, "2011-10-27T09:46:01.607"));
list.get(1)=(1, "2011-05-27T09:46:01.607"));
list.get(2)= (1, "2011-04-27T09:46:01.607"));
list.get(3)=(2, "2011-06-27T09:46:01.607"));
list.get(4)=(5, "2011-07-27T09:46:01.607"));
list.get(5)=(6, "2011-08-27T09:46:01.607"));
list.get(6)=(6, "2011-09-27T09:46:01.607"));
解决方案
您可以有 2 个比较器,如下所示
IdSorter.java
public class IdSorter implements Comparator<MyObject>
{
public int compare(MyObject o1, MyObject o2)
{
return o1.getId() - o2.getId();
}
}
DateSorter.java
public class DateSorter implements Comparator<MyObject>
{
public int compare(MyObject o1, MyObject o2)
{
return o1.getTime().compareTo(o2.getTime());
}
}
然后你可以像下面这样排序
爪哇 8
Collections.sort(list, new IdSorter()
.thenComparing(new DateSorter()));
低于 Java 8
MyObjectChainedComparator.java
public class MyObjectChainedComparator implements Comparator<MyObject> {
private List<Comparator<MyObject>> listComparators;
@SafeVarargs
public MyObjectChainedComparator(Comparator<MyObject>... comparators) {
this.listComparators = Arrays.asList(comparators);
}
@Override
public int compare(MyObject o1, MyObject o2) {
for (Comparator<MyObject> comparator : listComparators) {
int result = comparator.compare(o1, o2);
if (result != 0) {
return result;
}
}
return 0;
}
}
使用如下MyObjectChainedComparator.java
类
Collections.sort(list, new MyObjectChainedComparator(
new IdSorter(),
new DateSorter()));
您的结果将如下所示
Id 1 Time 2011-04-27T09:40:01.607
Id 1 Time 2011-05-27T09:42:01.607
Id 1 Time 2011-10-27T09:46:01.605
Id 2 Time 2011- 06-27T09:42:01.607
Id 5 Time 2011-07-27T09:43:01.607
Id 6 Time 2011-08-27T09:44:01.607
Id 6 Time 2011-09-27T09:45:01.607
推荐阅读
- javascript - 通过 getter 将数据代理到计算属性(v-model)
- javascript - await 没有得到返回值
- python - 尝试使用 openpyxl.load_workbook 访问文件时出现“TypeError:值必须是序列”
- excel - 在excel中的特定范围之间复制数据
- php - WHMCS 配置模块,默认添加自定义字段
- laravel - 如何安全地处理在 laravel 刀片上传递的复杂数据结构?
- spring - spring maven部署后的url
- mysql - 如何在mysql中找到在30秒内重复特定列3次以上
- java - 如何使用 Python 读取用 Java 编写的字节文件
- .net - Azure DevOps 为 Winforms 应用程序构建管道