首页 > 编程语言 >java自定义中文排序比较器

java自定义中文排序比较器

时间:2024-02-18 15:45:11浏览次数:31  
标签:java String 自定义 dataList sortInfoList SortDTO add new 排序

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));

 

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

 

标签:java,String,自定义,dataList,sortInfoList,SortDTO,add,new,排序
From: https://www.cnblogs.com/pzw23/p/18019395

相关文章

  • mysql创建数据库排序规则utf8_general_ci和utf8_unicode_ci区别
    在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么大家都使用utf8_general_ci而不是utf8_unicode_ci呢?ci是caseinsensitive,即"大小写不敏感",a和A会在字符判断中会被当做一样的;bin是二进制,a和A会别区别对待。例如你运行:SELECT*FR......
  • Java21 + SpringBoot3使用Spring Security时如何在子线程中获取到认证信息
    目录前言原因分析解决方案方案1:手动设置线程中的认证信息方案2:使用DelegatingSecurityContextRunnable创建线程方案3:修改SpringSecurity安全策略通过设置JVM参数修改安全策略通过SecurityContextHolder修改安全策略总结前言近日心血来潮想做一个开源项目,目标是做一款可以适配多......
  • java实现幂等性校验
    我们在做web应用的时候通常会遇到前端提交按钮重复点击的场景,在某些新增操作上就需要做幂等性限制来保证数据的可靠性。下面来用javaaop实现幂等性校验。一:首先我们需要一个自定义注解packagecom.yuku.yuku_erp.annotation;importjava.lang.annotation.*;/***@author......
  • Java集合篇之深入解析LinkedList
    写在开头作为ArrayList的同门师兄弟,LinkedList的师门地位逊色不少,除了在做算法题的时候我们会用到它之外,在实际的开发工作中我们极少使用它,就连它的创造者都说:“Iwroteit,andIneveruseit”,想想颇有点好笑,但这并不影响我们去学习它,个人认为它底层的链表逻辑对于我们代码思想......
  • 排序算法总结
    冒泡排序稳定排序时间复杂度o(n2)空间复杂度o(1)点击查看代码staticvoidBubbleSort(){int[]data={1,8,5,7,9,4,6,99,88,74};inti,j,flag;//岗哨模式的冒泡排序for(i=data.Length-1;i>0......
  • Java是值传递
    一、定义值传递:当⼀个参数按照值的⽅式在两个⽅法之间传递时,调⽤者和被调⽤者其实是⽤的两个不同的变量——被调⽤者中的变量(原始值)是调⽤者中变量的⼀份拷⻉,对它们当中的任何⼀个变量修改都不会影响到另外⼀个变量。引用传递:当⼀个参数按照引⽤传递的⽅式在两个⽅法之间传递时,......
  • 冒泡排序
    需求冒泡排序,把数组从小到大进行排列思路总结冒泡排序采用双循环,i循环代表要排序几趟,j循环代表一趟要排序几次;有n个数要排n-1趟,一趟n-i次(因为前面排过的数字不必再排);冒泡排序算法思路图(bubble):代码实现packagecom.jichu.Arry;importjava.util.Arrays;publiccla......
  • 10 个图像悬停效果 CSS & JavaScript 代码片段
    悬停效果一直是向网站添加交互元素的最简单方法之一,我们看到它们经常用于突出显示文本链接或按钮。悬停效果尤其强大的一个领域是当它们应用于图像时,无论是作为小型卡片布局的一部分还是大型相册的一部分,都可以产生很棒的效果。今天,我们将向您展示设计师将悬停效果集成到图像中的......
  • JavaSE第五步 —— 运算符
    一、运算符运算符的分类不尽相同,以下都是参考的相关书籍名称符号算数运算符一元运算符++、--算术运算符二元运算符+、-、*、/、%赋值运算符=扩展运算符+=、-=、*=、/=关系运算符>、<、=、>=、<=、==、!=、instanceof逻辑运算符&&、位......
  • Java并发工具类
    CopyOnWriteArraySet是Java中的线程安全集合类,它是CopyOnWriteArrayList的Set版本。它通过使用"写时复制"(Copy-On-Write)策略来实现线程安全。特点:线程安全:CopyOnWriteArraySet是线程安全的,可以在多线程环境下安全地进行读取和遍历操作,而不需要额外的同步措施。写时复制:当对集合......