list.stream().sorted(Comparator.comparing(类::属性一).thenComparing(类::属性二))...;
前端传给我一个数组集合,定义了要排序的字段,以及排序的先后顺序。 例如一个 student 类:0 代表年龄,1 代表性别,2 代表地理位置,3 代表年级。
如果前端传递数组[1,3],那么要排序的字段 2 个,先按性别排序,再按年级排序。 如果前端传递数字[3,0,1],那么要排序的字段 3 个,先按年级排序,再按年龄排序,最后再按性别排序。
这个要怎么搞啊。。
PS:list 集合数据是接口返回的,没法直接在 SQL 里面排序。。 语言是 Java
1
wysnylc 2020-04-08 12:04:29 +08:00
判断数组 length,写两个分支
|
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))
|
3
jsonnnnnn OP 研究了一下,,自定义了一个 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; } } |