自制了一个wbsCode层级的JAVA排序算法

发布时间 2023-10-26 11:55:12作者: 信铁寒胜

1、需要:对“1.1”,“1.2”,“1.3”,“1.1.1”,“2”,“4”,“5”,“4.1.1”,“11” 进行排序

想要的效果:“1.1”,“1.1.1”,“1.2”,“1.3”,“2”,“4”,“4.1.1”,“5”,“11”

如果用JAVA原生的compareTo 比较

public static void main(String[] args) throws Exception {
       String[] arr = new String[]{"1.1","1.2","1.3","1.1.1","2","4","5","4.1.1","11"};
       List<String> list = Arrays.asList(arr);
       Collections.sort(list, new Comparator<String>() {
           @Override
           public int compare(String o1, String o2) {
               return o1.compareTo(o2);
           }
       });
        System.out.println(list); //[1.1, 1.1.1, 1.2, 1.3, 11, 2, 4, 4.1.1, 5]
    }

  结果不符合预期。11在2的前面显然不对

 

2、自制一个算法:也很简单。

1、去除wbsCode里面的小数点,然后再后面补0。转正long类型,进行比较大小。

根据实际实际需求,这里假设,小数点的个数,不会超出9位。

2、在后面补多少个0,要根据wbsCode实际有的小数来判断。补0数 = 9 - wbsCode小数点个数。

 

public static void main(String[] args) throws Exception {
       String[] arr = new String[]{"1.1","1.2","1.3","1.1.1","2","4","5","4.1.1","11"};
       List<String> list = Arrays.asList(arr);
       Collections.sort(list, new Comparator<String>() {
           @Override
           public int compare(String o1, String o2) {
               String wbsCode1 = o1.replaceAll("\\.","");
               String wbsCode2 = o2.replaceAll("\\.","");

               int pointNum1 = 9-o1.split("\\.").length;
               int pointNum2 = 9-o2.split("\\.").length;

               String zero1 = "";
               String zero2 = "";
               for(int index=0;index<pointNum1;index++){
                   zero1 += "0";
               }
               for(int index=0;index<pointNum2;index++){
                   zero2 += "0";
               }
               wbsCode1 = wbsCode1+ zero1;
               wbsCode2 = wbsCode2 +zero2;
               // 转换为long类型
               long wbsCodeLong1 = Long.parseLong(wbsCode1);
               long wbsCodeLong2 = Long.parseLong(wbsCode2);
               if(wbsCodeLong1 > wbsCodeLong2){
                   return 1;
               }else{
                   return -1;
               }
           }
       });
       System.out.println(list); //[1.1, 1.1.1, 1.2, 1.3, 2, 4, 4.1.1, 5, 11]
    }