我需要按名称的字母顺序对列表进行排序,然后再按类型对其进行一次排序,并将具有特定类型的元素放在列表的顶部。这是我迄今为止所做的,但它没有像预期的那样工作,它只返回按名称排序的列表。
public List<PRDto> present(
List<ParticipantReference> participants) {
return participants.stream()
.map(MAPPER::toDto)
.sorted(Comparator.comparing(PRDto::getName)
.thenComparing(PRDto::getParticipantType, (type1, type2) -> {
if (type1.equals(type2)) {
return 0;
}
if (type2.equals(ParticipantType.S.getDescription())) {
return 1;
}
if (type1.equals(ParticipantType.S.getDescription())) {
return -1;
}
return type1.compareTo(type2);
}))
.collect(toList());
}
这是我的枚举:
@Getter
public enum ParticipantType {
F("F"),
D_F("D+F"),
S("S");
private final String description;
ParticipantType(String description) {
this.description = description;
}
}
2条答案
按热度按时间6mw9ycah1#
为了保持可读性,我不会将比较放在流管道中,而是在比较器中提取它
我的回答有多余的逻辑,霍尔格谢天谢地向我指出了这一点。这也可以内联,因为霍尔格在评论中提到:
s5a0g9ez2#
请注意,如果要先按类型排序,然后按名称排序,则需要这样做。反之,则需要排序算法来保持相等元素的现有顺序,这可能并不总是有保证的。
将枚举Map到表示order和let的整数也会更容易
Comparator
做这项工作。所以你的代码可以是这样的:
如果您使用这样的复合比较器,它会将元素类型
S
在顶端。如果你把比较器写成“旧”的样子,它可能是这样的:示例(已订购):