按自然顺序对对象中的多个字段进行排序

Sorting multiple fields from an object in natural order

提问人:Tiana 提问时间:6/17/2023 最后编辑:chameerarTiana 更新时间:6/18/2023 访问量:73

问:

目前,我使用 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"},
java android 排序 lambda

评论

0赞 Elliott Frisch 6/17/2023
从字面上看,总是这样吗?我们能看到吗?"Item [NUMBER]"Item
0赞 Tiana 6/17/2023
我不确定我是否完全理解,但我在原始问题中输入了额外的数据。不知道这是否是你要找的。

答:

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'}]