V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jsonnnnnn
V2EX  ›  问与答

求助大佬!多字段排序问题。。

  •  
  •   jsonnnnnn · 2020-04-08 11:44:15 +08:00 · 934 次点击
    这是一个创建于 1487 天前的主题,其中的信息可能已经有所发展或是发生改变。

    list.stream().sorted(Comparator.comparing(类::属性一).thenComparing(类::属性二))...;

    前端传给我一个数组集合,定义了要排序的字段,以及排序的先后顺序。 例如一个 student 类:0 代表年龄,1 代表性别,2 代表地理位置,3 代表年级。

    如果前端传递数组[1,3],那么要排序的字段 2 个,先按性别排序,再按年级排序。 如果前端传递数字[3,0,1],那么要排序的字段 3 个,先按年级排序,再按年龄排序,最后再按性别排序。

    这个要怎么搞啊。。

    PS:list 集合数据是接口返回的,没法直接在 SQL 里面排序。。 语言是 Java

    4 条回复    2020-04-08 17:46:53 +08:00
    wysnylc
        1
    wysnylc  
       2020-04-08 12:04:29 +08:00
    判断数组 length,写两个分支
    popvlovs
        2
    popvlovs  
       2020-04-08 17:01:00 +08:00
    先定义一个 Map<Integer, Function> comparators,然后遍历数组集合,生成 Comparator 不行么?像这样 Comparator.comparing(comparators.get(3)).thenComparing(comparators.get(0)).thenComparing(comparators.get(1))
    jsonnnnnn
        3
    jsonnnnnn  
    OP
       2020-04-08 17:45:50 +08:00
    研究了一下,,自定义了一个 comparator 搞定了。。

    public class GoogleReportComparator implements Comparator<CampaignVO> {

    private ArrayList<String> fieldList;

    public GoogleReportComparator(ArrayList<String> fieldList) {
    this.fieldList = fieldList;
    }

    @Override
    public int compare(CampaignVO obj1, CampaignVO obj2) {

    int compare = 0;
    for (int i = 0; i < fieldList.size(); i++) {
    compare = getCompare(obj1, obj2, i);

    if (compare != 0) {
    return compare;
    }
    }
    return compare;
    }

    private int getCompare(CampaignVO obj1, CampaignVO obj2, int i) {
    String filedValue1 = getCurrnetFiledValue(obj1, fieldList.get(i));
    String filedValue2 = getCurrnetFiledValue(obj2, fieldList.get(i));
    return filedValue1.compareTo(filedValue2);
    }


    private String getCurrnetFiledValue(CampaignVO campaignVO, String fieldName) {
    StringBuffer sb = new StringBuffer();
    sb.append("get");
    sb.append(fieldName.substring(0, 1).toUpperCase());
    sb.append(fieldName.substring(1));

    try {
    Method method = campaignVO.getClass().getMethod(sb.toString());

    Object obj = method.invoke(campaignVO);
    if (null == obj) {
    return StringUtils.EMPTY;
    } else {
    return obj.toString();
    }

    } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
    log.error("invoke method error::", e);
    }
    return StringUtils.EMPTY;
    }
    }
    jsonnnnnn
        4
    jsonnnnnn  
    OP
       2020-04-08 17:46:53 +08:00
    @popvlovs 我研究了下,已经搞定了。。谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   798 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:44 · PVG 06:44 · LAX 15:44 · JFK 18:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.