大佬们! Java list 集合根据元素(全部是 String 类型)排序,排序顺序外部传入,如何实现,如何优雅的实现?

2021-08-11 16:05:04 +08:00
 Daisy17607
1893 次点击
所在节点    Java
13 条回复
NillSpake
2021-08-11 16:10:14 +08:00
Comparable c = new ***Comparable();
list.stream().sort(c::compareTo);
自己实现一个 Comparable ?
vance123
2021-08-11 16:10:51 +08:00
作业自己做
guaguaguaxia1
2021-08-11 16:13:20 +08:00
排序顺序外部传入啥意思
Daisy17607
2021-08-11 16:16:12 +08:00
@NillSpake @vance123 这种
List<RowSortDTO> collect = rows.stream().sorted(
Comparator.comparing(RowSortDTO::getVal1)
.thenComparing(RowSortDTO::getVal2)
.thenComparing(RowSortDTO::getVal3)
.thenComparing(RowSortDTO::getVal4)
.thenComparing(RowSortDTO::getVal5)
).collect(java.util.stream.Collectors.toList());
这都是自然顺序排的嘛。从外面指定一个顺序,比如一个布尔,或一个枚举,表明是正序还是倒序
Daisy17607
2021-08-11 16:17:23 +08:00
@guaguaguaxia1 看我上条回复说清楚没
Morii
2021-08-11 16:20:32 +08:00
可以啊 实现几个策略枚举就行了啊。然后调用枚举的排序方法就好
chendy
2021-08-11 16:25:18 +08:00
维护一个 Map<String, Comparator<Stirng>> ,接收一个 String,取 Comparator 做排序
如果只有正序倒序就接个 boolean 判断一下就行了,没必要弄太复杂
INTOX8O
2021-08-11 16:54:53 +08:00
和一楼类似:维护一个 Function,以 Function 的具体实现为排序条件 https://z3.ax1x.com/2021/08/11/fUvR9x.png
Daisy17607
2021-08-11 16:55:21 +08:00
@chendy @Morii 兄弟,我也去百度扒了,按你们的思路还是搞不定,能不能上代码,请喝咖啡
zliea
2021-08-11 17:17:00 +08:00
外部传入[{"sortBy":"xxx","direction":ASC}],然后去反射获取值然后拼接 Comparator ?
Daisy17607
2021-08-11 17:21:37 +08:00
@ztechstack 差不多,就是根据指定的顺序决定我要不要加.reversed()方法
thetbw
2021-08-11 17:34:04 +08:00
外部排序就是每个规则都有个优先级呗,例如 c 开头的优先级最高,x 开头的其次,那就按照传统的排序方法,遍历 这个外部规则,计算出一个优先级,先按照这个优先级排序,相同优先级再按照默认的。感觉和之前写过类似的 sql.

https://segmentfault.com/a/1190000021517916
quan7u
2021-08-11 18:06:50 +08:00
前几天做了个类似需求,无脑遍历了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/795119

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX