按另一个列表中存在的日期对列表进行排序
Sort a List by a date present in another list
我有这样的情况:
@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<ObjectA>
进行排序,其中还包含 List<ObjectB>
的 ID,并且排序必须是:
- 按
List<ObjectB>
的“createdOn”属性的降序日期包含在 List<ObjectA>
中并与 ids 区分开来
- 按降序排列
- 按降序编码
有了这个,我用 .sort() 和比较器按名称和代码排序:
listA.sort(o -> o.getName())
.thenComparing(o -> o.getCode()).reversed();
我无法生成的部分是基于正在排序的列表中不存在但在另一个可通过 id 区分的属性的列表排序。
谢谢大家的帮助。
也许你需要这样的东西:
Map<Integer, Timestamp> mapOfB = listB.stream()
.collect(Collectors.toMap(ObjectB::getId,
ObjectB::getCreatedOn));
listA.sort(Comparator.comparing(o-> mapOfB.get(((ObjectA)o).getId()),
Comparator.nullsLast(Comparator.reverseOrder()))
.thenComparing(o->((ObjectA)o).getName())
.thenComparing(o->((ObjectA)o).getCode(), Comparator.reverseOrder()));
我建议您将 ObjectB 的列表转换为 Map<id, createdOn>
,因为在 Map 中按键检索元素是 O(1),而在 List 中是 O(n)。
Map<Integer, Timestamp> createdOnMap =
bList.stream().collect(Collectors.toMap(ObjectB::getId, ObjectB::getCreatedOn));
然后通过获取此映射的值进行比较,如果不存在,则通过将值与 maximum/minimum 值进行比较来决定是将其放在列表中的第一个还是最后一个。 LocalDateTime 的示例:
aList.stream()
.sorted(Comparator.comparing(objectA -> createdOnMap.getOrDefault(objectA.getId(), LocalDateTime.MAX)))
.collect(Collectors.toList())
在 createdOnMap 没有此 id 值的情况下,它与 LocalDateTime.MAX/MIN
.
进行比较
如果你还想在最后的列表中包含List中不存在但存在于List中的元素,那么你需要在通过将ObjectB转换为ObjectA进行排序之前自行添加这些元素。
我有这样的情况:
@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<ObjectA>
进行排序,其中还包含 List<ObjectB>
的 ID,并且排序必须是:
- 按
List<ObjectB>
的“createdOn”属性的降序日期包含在List<ObjectA>
中并与 ids 区分开来
- 按降序排列
- 按降序编码
有了这个,我用 .sort() 和比较器按名称和代码排序:
listA.sort(o -> o.getName())
.thenComparing(o -> o.getCode()).reversed();
我无法生成的部分是基于正在排序的列表中不存在但在另一个可通过 id 区分的属性的列表排序。
谢谢大家的帮助。
也许你需要这样的东西:
Map<Integer, Timestamp> mapOfB = listB.stream()
.collect(Collectors.toMap(ObjectB::getId,
ObjectB::getCreatedOn));
listA.sort(Comparator.comparing(o-> mapOfB.get(((ObjectA)o).getId()),
Comparator.nullsLast(Comparator.reverseOrder()))
.thenComparing(o->((ObjectA)o).getName())
.thenComparing(o->((ObjectA)o).getCode(), Comparator.reverseOrder()));
我建议您将 ObjectB 的列表转换为 Map<id, createdOn>
,因为在 Map 中按键检索元素是 O(1),而在 List 中是 O(n)。
Map<Integer, Timestamp> createdOnMap =
bList.stream().collect(Collectors.toMap(ObjectB::getId, ObjectB::getCreatedOn));
然后通过获取此映射的值进行比较,如果不存在,则通过将值与 maximum/minimum 值进行比较来决定是将其放在列表中的第一个还是最后一个。 LocalDateTime 的示例:
aList.stream()
.sorted(Comparator.comparing(objectA -> createdOnMap.getOrDefault(objectA.getId(), LocalDateTime.MAX)))
.collect(Collectors.toList())
在 createdOnMap 没有此 id 值的情况下,它与 LocalDateTime.MAX/MIN
.
如果你还想在最后的列表中包含List中不存在但存在于List中的元素,那么你需要在通过将ObjectB转换为ObjectA进行排序之前自行添加这些元素。