【问题标题】:Sort list of object by custom order of a field [duplicate]按字段的自定义顺序对对象列表进行排序[重复]
【发布时间】:2020-04-02 12:19:07
【问题描述】:

问题

我有一个 Student 对象的列表(我只是以这种方式编写列表以便它变得更具可读性):

class Student {
    int id;
    String name;
    String department;
}

[
    {"id": 1, "name": "some name 1", "department": "English"},
    {"id": 2, "name": "some name 2", "department": "Maths"},
    {"id": 3, "name": "some name 3", "department": "Science"}
]

我想根据部门的自定义顺序对这个列表进行排序。

["Maths", "Science", "English"]

最终的排序列表应如下所示:

[
    {"id": 2, "name": "some name 2", "department": "Maths"},
    {"id": 3, "name": "some name 3", "department": "Science"},
    {"id": 1, "name": "some name 1", "department": "English"}
]

我尝试了什么

  1. 我对列表进行了迭代,列出了所有部门,并对所有列表进行了排序,最后,我对所有列表进行了合并。但它占用了太多额外空间,优化不够。
  2. 我尝试使用可比较,但这样我只能按字段对对象进行排序。

我想要什么

我想按 id 排序,但在此之前.. 我​​也想对部门进行排序。部门的排序将基于部门列表。第一个应该是数学,第二个应该是科学,最后一个应该是英语。

我想要一些建议,例如如何以更好的性能实现这一目标。

【问题讨论】:

  • 自定义排序顺序是什么?
  • 你试过的选项2,这不是你想做的吗?即按字段排序,只是它是自定义顺序。有什么问题?您可以在逻辑中添加您想要的顺序,并基于此返回值。 (在这种情况下,我宁愿建议一个比较器来获得更好的设计,而不是比较)
  • 不,这个问题与这个问题不同。 @大牛
  • 如何从 Comparator @gurioso 给出排名
  • 是的,我阅读了您的评论,但我应该如何实现这一点。我应该如何使用这个 hashmap 实现比较器。

标签: java list sorting collections comparator


【解决方案1】:

您可以创建一个枚举来保存不同部门的优先级。 即

enum SchoolDepartmentEnum{
ENGLISH(1,3,"English"),

MATHS(2,1,"Maths"),

SCIENCE(3,2,"Science");

constructor:  SchoolDepartmentEnum(int id, int priority, string name);

}

然后创建一个 Comparator 类,它将使用您创建的枚举中的优先级 ID。

【讨论】:

  • 我应该如何在比较器中使用这个枚举?
  • 您可以在需要时调用比较器(顺便说一句,您可以创建自己的比较器来实现 Java 的 Comparator),并使用类似“list.stream().sorted(新的 YourComparatorClass())"。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2019-05-28
  • 1970-01-01
  • 2021-04-23
相关资源
最近更新 更多