提问人:Tiana 提问时间:6/17/2023 最后编辑:chameerarTiana 更新时间:6/18/2023 访问量:73
按自然顺序对对象中的多个字段进行排序
Sorting multiple fields from an object in natural order
问:
目前,我使用 lamda 排序首先对 listID 进行排序,然后对 Item Name 进行排序
Comparator < Item > itemComparator = Comparator.comparing(Item::getListId)
.thenComparing(Item::getItemName);
Collections.sort(itemList, itemComparator);
这在技术上是可行的,但 ItemName 是字母数字,并按 ASCII 而不是自然顺序排序 因此,不是第 0 项,而是第 101 项,第 28 项。我想要项目 0、项目 28、项目 101。有没有简单的方法可以做到这一点?
编辑:项目正在从 JSON 文件中获取信息
[{"id": 684, "listId": 1, "name": "Item 684"},
{"id": 276, "listId": 1, "name": "Item 276"},
{"id": 808, "listId": 4, "name": "Item 808"},
{"id": 680, "listId": 3, "name": "Item 680"},
{"id": 534, "listId": 4, "name": "Item 534"},
{"id": 906, "listId": 2, "name": "Item 906"},
{"id": 735, "listId": 1, "name": "Item 735"},
答:
1赞
Elliott Frisch
6/17/2023
#1
根据您添加的 JSON,名称似乎只是文本“Item”,然后是 id。这是数字。比较一下。
Comparator<Item> itemComparator = Comparator.comparing(Item::getListId)
.thenComparing(Item::getId);
Collections.sort(itemList, itemComparator);
评论
0赞
Tiana
6/17/2023
我考虑过这一点,但这是编程挑战的一部分,它明确指出按 itemName 排序。具体来说,它说“显示按”listId“分组的所有项目,显示时先按”listId“对结果进行排序,然后按”name“排序。筛选出“name”为空或 null 的任何项。
0赞
Elliott Frisch
6/17/2023
@Tiana 那么你可能应该使用你已经拥有的词法排序。否则,您将不得不解析 id,并且您必须做出更多假设才能正确执行此操作。
0赞
Reilas
6/17/2023
#2
"...因此,不是第 0 项,而是第 101 项,第 28 项。我想要项目 0、项目 28、项目 101。有没有简单的方法可以做到这一点?..."
您可以从闭包中解析名称中的数值。
Comparator<Item> comparator
= Comparator.comparing(Item::getListId)
.thenComparing(value -> {
int indexOf = value.name.indexOf(' ');
return Integer.parseInt(value.name.substring(indexOf + 1));
});
list.sort(comparator);
输出
[{id=276, listId=1, name='Item 276'},
{id=684, listId=1, name='Item 684'},
{id=735, listId=1, name='Item 735'},
{id=906, listId=2, name='Item 906'},
{id=680, listId=3, name='Item 680'},
{id=534, listId=4, name='Item 534'},
{id=808, listId=4, name='Item 808'}]
评论
"Item [NUMBER]"
Item