• 请不要在回答技术问题时复制粘贴 AI 生成的内容
followyourheart
V2EX  ›  程序员

像这种代码如何优化 根据字段排序

  •  
  •   followyourheart · Jul 20, 2021 · 2816 views
    This topic created in 1943 days ago, the information mentioned may be changed or developed.

    不能直接在数据库排序 数据要从数据库查出组装,然后排序

    9 replies  •  2021-07-26 08:59:37 +08:00
    CEBBCAT
    CEBBCAT
    Jul 20, 2021 via Android
    1
    看得不是很懂,但我之前有一次排序也是很头大,那次我是通过算分来间接排序的,把所有的值都落在 int 上,然后按照顺序读出
    potatowish
    potatowish
    Jul 20, 2021 via iPhone
    2
    维护一个枚举类型,column,sortType,Comparator,isReversed, 再写一个方法根据 column sortType isReversed 匹配到唯一的枚举,另外一个方法根据枚举来动态处理数据
    potatowish
    potatowish
    Jul 20, 2021 via iPhone
    3
    @potatowish 采用这种方式,不需要在业务类写大量判断,只需要维护这个枚举中的映射关系就好了
    ForkNMB
    ForkNMB
    Jul 20, 2021
    4
    逆序不要用 reversed 噢,没啥必要,直接在比较器里传参就行,list.stream().sorted(Comparator.comparing(类::属性一,Comparator.reverseOrder()));
    至于优化的话,维护一个枚举类,维护不同种类的比较器即可(比较器的字段类型,是否逆序这些信息)
    itechify
    itechify
    Jul 20, 2021 via Android
    5
    枚举类+抽象方法 简简单单又美观
    xiang0818
    xiang0818
    Jul 21, 2021❤️1
    6
    ```
    package com.netease.ehr.mbo.model.enums;

    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    import java.util.function.Function;
    import java.util.stream.Collectors;

    /**
    * @author xiang0818
    * @date 2021-07-21 16:06
    */
    public enum SortEnum {

    /**
    * .
    */
    COUNT("count", SckPriceVo::getCount),
    ;
    private final String column;


    private final Function<SckPriceVo, Integer> functionGen;


    SortEnum(String column, Function<SckPriceVo, Integer> functionGen) {
    this.column = column;
    this.functionGen = functionGen;
    }

    public String getColumn() {
    return column;
    }

    private Comparator<SckPriceVo> getComparing(String sortType) {
    if (sortType.equals("1")) {
    return Comparator.comparing(functionGen);
    } else if (sortType.equals("2")) {
    return Comparator.comparing(functionGen).reversed();
    }
    throw new RuntimeException("error");
    }

    private static SortEnum getByColumn(String column) {
    for (SortEnum value : SortEnum.values()) {
    if (value.column.equals(column)) {
    return value;
    }
    }
    throw new RuntimeException("error");
    }

    public static List<SckPriceVo> getSort(List<SckPriceVo> sckPriceVoList, String column, String sortType) {
    return sckPriceVoList.stream().sorted(SortEnum.getByColumn(column).getComparing(sortType)).collect(Collectors.toList());
    }
    }
    EAFA0
    EAFA0
    Jul 21, 2021
    7
    简单抽象一下? 写个封装函数?
    ``` json
    public static sort(Collection<T> collection, Function<T, Comparable> getField, boolean isReserve)
    ```
    大概这个样子?
    EAFA0
    EAFA0
    Jul 21, 2021
    8
    @EAFA0 问题挺多, 大概意思 get 到就行?
    siweipancc
    siweipancc
    Jul 26, 2021 via iPhone
    9
    封装一个动态排序器,由前段调用时候生成。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1652 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 00:55 · PVG 08:55 · LAX 16:55 · JFK 19:55
    ♥ Do have faith in what you're doing.