1、先看看排序结果

 

2、自定义中文比较器

//Comparator<String[]>中String[]表示的是每一行数据
class StringArrayComparator implements Comparator<String[]> {
    private final List<SortDTO> sortDTOList; // 排序信息集合
    private final Collator collator = Collator.getInstance(Locale.CHINA); // 中文排序

    public StringArrayComparator(List<SortDTO> sortDTOList) {
        this.sortDTOList = sortDTOList;
    }

    @Override
    public int compare(String[] arr1, String[] arr2) {
        int result = 0;
        //遍历需要排序的列
        for (SortDTO sortDTO : sortDTOList) {
            String val1 = arr1[sortDTO.getIndex()];
            String val2 = arr2[sortDTO.getIndex()];
            if (sortDTO.isNumber()) {
                //数字类型比较
                double v1 = StringUtils.isEmpty(val1) ? 0 : Double.parseDouble(val1);
                double v2 = StringUtils.isEmpty(val1) ? 0 : Double.parseDouble(val2);
                result = Double.compare(v1, v2);
            } else {
                //使用String.valueOf避免空指针异常
                result = collator.compare(String.valueOf(val1), String.valueOf(val2));
            }
            if (sortDTO.isDesc()) {
                result *= -1;//降序时取相反数
            }
            if (result != 0) {
                //如果当前列排序结果不相等,则可以得出数据行的先后顺序了
                break;
            }
            //列排序结果相等,则进行下一列的排序比较
        }
        return result;
    }
}

class SortDTO {
    private final int index;//需要排序的列下标
    private final boolean isDesc;//是否降序
    private final boolean isNumber;//是否是数字

    public SortDTO(int index, boolean isDesc, boolean isNumber) {
        this.index = index;
        this.isDesc = isDesc;
        this.isNumber = isNumber;
    }

    public int getIndex() {
        return index;
    }

    public boolean isDesc() {
        return isDesc;
    }

    public boolean isNumber() {
        return isNumber;
    }
}

 

3、使用

public static void main(String[] args) {
        List<String[]> dataList = new ArrayList<>();
        dataList.add(new String[]{"北京", "张三", "100"});
        dataList.add(new String[]{"上海", "李四", "80"});
        dataList.add(new String[]{"广州", "王五", "120"});
        dataList.add(new String[]{"北京", "赵六", "120"});
        dataList.add(new String[]{"北京", "刘七", "120"});
        dataList.add(new String[]{"北京", "孙八", "110"});
        dataList.add(new String[]{"广州", "孙八", "110"});
        dataList.add(new String[]{"上海", "陈九", "90"});
        dataList.add(new String[]{null, "周十", "100"});

        dataList.add(new String[]{"北京", "赵丫", "120"});
        dataList.add(new String[]{"北京", "赵六", "100"});

        List<SortDTO> sortInfoList = new ArrayList<>();
        //哪一列先排序,则先添加进去
        sortInfoList.add(new SortDTO(0, false, false));
        sortInfoList.add(new SortDTO(1, true, false));
        sortInfoList.add(new SortDTO(2, false, true));


        // 对 dataList 进行排序
        dataList.sort(new StringArrayComparator(sortInfoList));

        // 打印排序后的结果
        for (String[] arr : dataList) {
            System.out.println(Arrays.toString(arr));
        }
    }
排序结果例子:
(1)先地区升序,再名字降序,最后数字升序
 List<SortDTO> sortInfoList = new ArrayList<>();
        //哪一列先排序,则先添加进去
        sortInfoList.add(new SortDTO(0, false, false));
        sortInfoList.add(new SortDTO(1, true, false));
        sortInfoList.add(new SortDTO(2, false, true));

结果

 

(2)先数字升序,再地区升序,最后名字降序
List<SortDTO> sortInfoList = new ArrayList<>();
        //哪一列先排序,则先添加进去
        sortInfoList.add(new SortDTO(2, false, true));
        sortInfoList.add(new SortDTO(0, false, false));
        sortInfoList.add(new SortDTO(1, true, false));

 

(3)只是数字降序
List<SortDTO> sortInfoList = new ArrayList<>();
        //哪一列先排序,则先添加进去
        sortInfoList.add(new SortDTO(2, true, true));

 

其他情况就不一一列举了。