大佬们! Java list 集合根据元素(全部是 String 类型)排序,排序顺序外部传入,如何实现,如何优雅的实现? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Daisy17607
V2EX    Java

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

  •  
  •   Daisy17607 2021-08-11 16:05:04 +08:00 2659 次点击
    这是一个创建于 1602 天前的主题,其中的信息可能已经有所发展或是发生改变。
    13 条回复    2021-08-11 18:06:50 +08:00
    NillSpake
        1
    NillSpake  
       2021-08-11 16:10:14 +08:00
    Comparable c = new ***Comparable();
    list.stream().sort(c::compareTo);
    自己实现一个 Comparable ?
    vance123
        2
    vance123  
       2021-08-11 16:10:51 +08:00   1
    作业自己做
    guaguaguaxia1
        3
    guaguaguaxia1  
       2021-08-11 16:13:20 +08:00
    排序顺序外部传入啥意思
    Daisy17607
        4
    Daisy17607  
    OP
       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
        5
    Daisy17607  
    OP
       2021-08-11 16:17:23 +08:00
    @guaguaguaxia1 看我上条回复说清楚没
    28Sv0ngQfIE7Yloe
        6
    28Sv0ngQfIE7Yloe  
       2021-08-11 16:20:32 +08:00
    可以啊 实现几个策略枚举就行了啊。然后调用枚举的排序方法就好
    chendy
        7
    chendy  
       2021-08-11 16:25:18 +08:00
    维护一个 Map<String, Comparator<Stirng>> ,接收一个 String,取 Comparator 做排序
    如果只有正序倒序就接个 boolean 判断一下就行了,没必要弄太复杂
    INTOX8O
        8
    INTOX8O  
       2021-08-11 16:54:53 +08:00
    和一楼类似:维护一个 Function,以 Function 的具体实现为排序条件 https://z3.ax1x.com/2021/08/11/fUvR9x.png
    Daisy17607
        9
    Daisy17607  
    OP
       2021-08-11 16:55:21 +08:00
    @chendy @Morii 兄弟,我也去百度扒了,按你们的思路还是搞不定,能不能上代码,请喝咖啡
    zliea
        10
    zliea  
       2021-08-11 17:17:00 +08:00
    外部传入[{"sortBy":"xxx","direction":ASC}],然后去反射获取值然后拼接 Comparator ?
    Daisy17607
        11
    Daisy17607  
    OP
       2021-08-11 17:21:37 +08:00
    @ztechstack 差不多,就是根据指定的顺序决定我要不要加.reversed()方法
    thetbw
        12
    thetbw  
       2021-08-11 17:34:04 +08:00
    外部排序就是每个规则都有个优先级呗,例如 c 开头的优先级最高,x 开头的其次,那就按照传统的排序方法,遍历 这个外部规则,计算出一个优先级,先按照这个优先级排序,相同优先级再按照默认的。感觉和之前写过类似的 sql.

    https://segmentfault.com/a/1190000021517916
    quan7u
        13
    quan7u  
       2021-08-11 18:06:50 +08:00
    前几天做了个类似需求,无脑遍历了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3320 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 04:19 PVG 12:19 LAX 20:19 JFK 23:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86