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));
其他情况就不一一列举了。