java实战:多属性排序
多属性排序的核心点就是对Arrays.sort()和Collections.sort()方法的Comparator进行重写
- Arrays.sort()的三种用法
1.1、Arrays.sort(int[] a) 这种形式是对一个数组的所有元素进行排序,并且是按从小到大的顺序。较常用
1.2、Arrays.sort(int[] a, int fromIndex, int toIndex)
这种形式是对数组部分排序,也就是对数组a的下标从fromIndex到toIndex-1的元素排序,注意:下标为toIndex的元素不参与排序!
1.3、对Comparator进行重写,即多属性排序,以二维数组为例,共列举两种场景:
场景1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public static void main(String[] args) { int [][] arr = {{ 2 , 6 , 4 }, { 6 , 5 , 7 }, { 6 , 1 , 1 }}; Arrays.sort(arr, new Comparator< int []>() { @Override public int compare( int [] o1, int [] o2) { return o1[ 1 ]-o2[ 1 ]; // 按第2列升序排列 return o1[0]-o2[0] 表示按第一列排序 }); for ( int i = 0 ; i < 3 ; i++) { for ( int j = 0 ; j < 3 ; j++) { System.out.print(arr[i][j] + " " ); } System.out.println(); } } |
场景:2:按二维数组的第一列升序排序,如果第一列值相同,就按第二例降序排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public static void main(String[] args) { int [][] arr = {{ 2 , 6 , 4 }, { 6 , 5 , 7 }, { 6 , 1 , 1 }}; Arrays.sort(arr, new Comparator< int []>() { @Override public int compare( int [] o1, int [] o2) { if (o1[ 0 ]>o2[ 0 ]){ return 1 ; } else if (o1[ 0 ]<o2[ 0 ]){ return - 1 ; } else { return o2[ 1 ]-o1[ 1 ]; } } }); for ( int i = 0 ; i < 3 ; i++) { for ( int j = 0 ; j < 3 ; j++) { System.out.print(arr[i][j] + " " ); } System.out.println(); } } |
场景3:按二维数组的第一列升序排序,如果第一列值相同,就按第二例升序排序,如果第二列值相同,就按第3列升序排序,以此类推。。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public static void main(String[] args) { int [][] arr = {{ 2 , 6 , 4 }, { 6 , 5 , 7 }, { 6 , 1 , 1 }}; Arrays.sort(arr, new Comparator< int []>() { @Override public int compare( int [] o1, int [] o2) { for ( int k= 0 ;k<arr.length;k++){ // 下面这块就表示://如果按一条件比较结果相等,就使用第二个条件进行比较。 if (o1[k]>o2[k]){ return 1 ; } else if (o1[k]<o2[k]){ return - 1 ; } else { continue ; } } return 0 ; } }); for ( int i = 0 ; i < 3 ; i++) { for ( int j = 0 ; j < 3 ; j++) { System.out.print(arr[i][j] + " " ); } System.out.println(); } } |
总结:升序:o1-o2 降序:o2-o1 如果compare() 入参是基本数据类型 或char类型可以直接用减号“-”,
如果compare() 入参是Byte, Double, Integer, Float, Long 或 Short 这些包装类型,或者是String类型,可以替换如下:
升序:o1.compareTo(o2 ) 降序:o2.compareTo(o1 )
- Collections.sort()的用法
场景1:对于字符串类型的集合进行排序,按首字母升序,如果第一列值相同,就按照第二列降序排列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public static void main(String[] args) { List<String> ls = new LinkedList<>(); ls.add( "abdh" ); ls.add( "bmkhy" ); ls.add( "cbdga" ); ls.add( "aasd" ); // Collections.sort(ls); //默认是按字典序列升序 // 按首字母升序,如果第一列值相同,就按照第二列降序排列,以此类推 Collections.sort(ls, new Comparator<String>() { @Override public int compare(String o1, String o2) { // return o1.compareTo(o2); // 升序 如果是基本类型的包装类型,也可以用o1-o2,或o2-o1 if (o1.charAt( 0 ) > o2.charAt( 0 )) { return 1 ; } else if (o1.charAt( 0 ) < o2.charAt( 0 )) { return - 1 ; } else { // 即o1.charAt(0) = o2.charAt(0) 返回值是0 return o2.charAt( 1 ) - o1.charAt( 1 ); } } }); for ( int i = 0 ; i < ls.size(); i++) { System.out.println(ls.get(i)); } } |
场景2:对于字符串类型的集合进行排序,按首字母升序,如果第一列值相同,就按照第二列升序排列,如果第2列值相同,就按照第3列升序排列,以此类推。。
1 2 3 4 5 6 7 8 9 10 | public static void main(String[] args) { List<String> ls = new LinkedList<>(); ls.add( "abdh" ); ls.add( "bmkhy" ); ls.add( "cbdga" ); ls.add( "aasd" ); Collections.sort(ls, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); //compareTo()方法比较的时候是按照ASCII码逐位比较的 } <br>}); <br>for (int i = 0; i < ls.size(); i++) { System.out.println(ls.get(i)); } } |
场景2结果:
本文来自博客园,作者:{Justin_Hu},转载请注明原文链接:{https://www.cnblogs.com/gchenghu/}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!