list中的像10-2-8-10这样的数据怎么排序

[10-4, 10-4-8, 12-18-7, 12-18-2, 12-18-3, 12-18-4, 12-18-5, 6-4-1, 12-3-10, 10-6-7-4-3, 10-6-7-4-2, 12-3-12, 10-6-7-4-1, 12-3-11, 7-78-1-7, 7-78-1-6, 12-71-4, 12-71-3, 12-71-2, 12-3-14, 7-78-1-3, 12-3-13]排序前
[6-4-1, 7-78-1-3, 7-78-1-6, 7-78-1-7, 10-4, 10-4-8, 10-6-7-4-1, 10-6-7-4-2, 10-6-7-4-3, 12-3-10, 12-3-11, 12-3-12, 12-3-13, 12-3-14, 12-18-2, 12-18-3, 12-18-4, 12-18-5, 12-18-7, 12-71-2, 12-71-3, 12-71-4]排序后


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Test {

    public static void main(String[] args) {
        List<String> arr = new ArrayList<>();
        arr.add("10-4");
        arr.add("10-4-8");
        arr.add("12-18-7");
        arr.add("10-6-7-4-3");

        Collections.sort(arr,new SelfDefineComparator());

        for(String s: arr){
            System.out.println(s);
        }
    }

    //  自定义比较规则
    static class SelfDefineComparator implements Comparator<String>{

        @Override
        public int compare(String o1, String o2) {
            String[] o1Split = o1.split("-");
            String[] o2Split = o2.split("-");
            for(int i=0; i<o1Split.length; i++) {
                int o1Int = Integer.parseInt(o1Split[i]);
                //  o2比o1短且前面相同,则o2要在o1前面,也就是o2<o1,比如  o2:10-3    o1:10-3-5
                if(i == o2Split.length){
                    return 1;
                }
                int o2Int = Integer.parseInt(o2Split[i]);
                //  o1大于o2,o1要在o2前面
                if(o1Int > o2Int){
                    return 1;
                //  o1小于o2,o1要在o2后面
                }else if(o1Int < o2Int){
                    return -1;
                }
            }
            //  否则就是全部相同,不交换
            return 0;
        }
    }
}

暴力解法,全部String形式 数组每一项 全部 split("-") 数组的值全部存入 Map<String,Interge>
for example:
[10-4,10-4-8]
map.put("array:1-index:1",10);
map.put("array:1-index:2",4);
map.put("array:2-index:1",10);
map.put("array:2-index:2",4);
map.put("array:2-index:3",8);
一:map遍历取第一位排序(1.可以自定义排序 2.也可以转成List通过list的sort方法进行排序)
二:第一位相同的通过第二位排序,依次比对即可


public int compareTo(String one,String two){

        String[] arr1 = one.split("-");
        String[] arr2 = two.split("-");
        int len1 = arr1.length;
        int len2 = arr2.length;
        int min = Math.min(len1,len2);
        String str1,str2;
        for (int i=0;i<min;i++){
            str1 = arr1[i];
            str2 = arr2[i];
            if(str1.equals(str2)){
                continue;
            }
            if(str1.length()!= str2.length()){
                return  str1.length() - str2.length();
            }
            return str1.compareTo(str2);
        }
        return len1 - len2;
    }

public int compareTo(String one,String two){
 
        String[] arr1 = one.split("-");
        String[] arr2 = two.split("-");
        int len1 = arr1.length;
        int len2 = arr2.length;
        int min = Math.min(len1,len2);
        String str1,str2;
        for (int i=0;i<min;i++){
            str1 = arr1[i];
            str2 = arr2[i];
            // 相等比较下一组
            if(str1.equals(str2)){
                continue;
            }
            //长度不一样,位数多的数字大 比如100 99,最小的三位数要比两位数大
            if(str1.length()!= str2.length()){
                return  str1.length() - str2.length();
            }
            // 长度一致且不相等,直接调用compareTo即可
            return str1.compareTo(str2);
        }
        // 前面都一样,位数多的更大
        return len1 - len2;
    }