写排行榜功能,分值从高到低排。顺手 Arrays.sort(arr) 一调,结果是升序,最大分垫了底。降序得换个姿势,写法还不少。
基本类型数组的笨办法
int[] 不能直接传比较器,先 Arrays.sort 升序排好,再手动翻转数组。数据量不大就这么干,简单直接。要一步到位,先把 int[] 装箱成 Integer[] 再说。
包装类数组传比较器
Integer[] a = {3, 1, 2}; Arrays.sort(a, Collections.reverseOrder());reverseOrder 让比较器反过来,比自己写 lambda 省事。注意数组里不能有 null,不然比较时直接抛空指针,排序前把脏数据清一遍。
自己写比较器的坑
- 别用减法比较:return b - a 在极大极小值相减时会溢出,结果反了都不知道。
- 用 compare 方法:Integer.compare(b, a) 或 b.compareTo(a),安全又清晰。
- 稳定排序:分值相同想保持原顺序,Arrays.sort 本身是稳定的,直接用就行。
对象数组按字段降序
排自定义对象就传 Comparator.comparing 按字段取键,再调 reversed 翻转。和数据库 order by desc 一个意思,只不过挪到了内存里。数据上万条还频繁排序,不如直接让 SQL 排好,内存排序只是临时方案。
一句话:小数组升序加翻转最省事,对象数组用比较器加 reversed。正经的业务排序还是交给数据库,省内存也省 bug。