【发布时间】:2021-08-06 12:17:42
【问题描述】:
我有这样的情况:
@Getter
@Setter
public class ObjectA {
private Integer id;
private String code;
private String name;
}
@Getter
@Setter
public class ObjectB {
private Integer id;
private Timestamp createdOn;
}
我必须对还包含 List<ObjectB> 的 ID 的 List<ObjectA> 进行排序,并且排序必须是:
-
List<ObjectA>中包含的List<ObjectB>的“createdOn”属性的降序日期,可与 ID 区分开来 - 按降序命名
- 降序代码
我使用 .sort() 和比较器按名称和代码排序:
listA.sort(o -> o.getName())
.thenComparing(o -> o.getCode()).reversed();
我无法生成的部分是基于一个属性对列表进行排序,该属性不存在于正在排序的列表中,但另一个可通过 id 区分。
感谢大家的帮助。
【问题讨论】:
-
你需要通过它们的 id 将 A 元素映射到它们的 B 对应元素。出于性能原因,我建议为 B 构建一个映射,然后在比较器中映射,例如
Comparator.comparing(a -> mapOfB.get(a.getId()).getCreatedOn())。当然,您必须处理不存在的映射(即get()返回 null)等。 -
并非 List
的所有内容都存在于 List - 它会转到 NullPointer -
没错,这就是我在上一句中所指的内容。不要指望 SO 上的生产就绪解决方案。您通常会获得大纲或简化代码来帮助您入门,但您仍需要在代码中投入一些精力。
标签: java sorting comparable