V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
jsonnnnnn
V2EX  ›  问与答

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

  •  
  •   jsonnnnnn · Apr 8, 2020 · 1688 views
    This topic created in 2209 days ago, the information mentioned may be changed or developed.

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

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

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

    这个要怎么搞啊。。

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

    4 replies    2020-04-08 17:46:53 +08:00
    wysnylc
        1
    wysnylc  
       Apr 8, 2020
    判断数组 length,写两个分支
    popvlovs
        2
    popvlovs  
       Apr 8, 2020
    先定义一个 Map<Integer, Function> comparators,然后遍历数组集合,生成 Comparator 不行么?像这样 Comparator.comparing(comparators.get(3)).thenComparing(comparators.get(0)).thenComparing(comparators.get(1))
    jsonnnnnn
        3
    jsonnnnnn  
    OP
       Apr 8, 2020
    研究了一下,,自定义了一个 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
       Apr 8, 2020
    @popvlovs 我研究了下,已经搞定了。。谢谢
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3554 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 00:43 · PVG 08:43 · LAX 17:43 · JFK 20:43
    ♥ Do have faith in what you're doing.