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

2020-04-08 11:44:15 +08:00
 jsonnnnnn

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

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

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

这个要怎么搞啊。。

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

957 次点击
所在节点    问与答
4 条回复
wysnylc
2020-04-08 12:04:29 +08:00
判断数组 length,写两个分支
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
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
2020-04-08 17:46:53 +08:00
@popvlovs 我研究了下,已经搞定了。。谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/660380

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX