将List<Object>集合(汉字、字母、数字)按照拼音来排序

2023-05-16

目录

 

将List<Object>集合按照拼音来排序

1.需求

2.使用系统自带的compareTo可以排序汉字,如果其中混入了字母(纯字母),会直接排在汉字之前,一起来看一下下面的例子

2.1.数组排序:

2.2集合对象:

3.实现混合排序


将List<Object>集合按照拼音来排序

 

 

1.需求

混合排列 汉字、字母、数字,数字排在最前,字母跟汉字统一按照升序(a-z)来排列

2.使用系统自带的compareTo可以排序汉字,如果其中混入了字母(纯字母),会直接排在汉字之前,一起来看一下下面的例子

2.1.数组排序:

String[] li = new String[]{
                "啊", "好", "bbb"
        };
 Arrays.sort(li);
        for (String s : li) {
            System.out.println(s);
        }

 会输出:

        bbb
		啊
		好

从打印结果看,bbb在 啊 之前,明显不符合我们的需求

2.2集合对象:

List<User> list = Arrays.asList(
                new User("就", 25),
                new User("bbbbbb", 25),
                new User("啊dd", 25),
                new User("aaaa", 25),
                new User("a试试", 25),
                new User("a试试", 24),
                new User("啊aaz", 25)
        );
         Collections.sort(list, (l1, l2) -> {
            Collator instance = Collator.getInstance(Locale.CHINA);
            return instance.compare(l1.name, l2.name);
        });
         for (User user : list) {
            System.out.println(user);
        }

输出:

    user{name=aaaa, age=25}
	user{name=a试试, age=25}
	user{name=a试试, age=24}
	user{name=bbbbbb, age=25}
	user{name=啊aaz, age=25}
	user{name=啊dd, age=25}
	user{name=就, age=25}

在输出的结果中可以看到 bbbbbb 排到了啊aaz前面,这个明显不符合我们的预期

3.实现混合排序

具体代码

public class Test {
 		@RequiresApi(api = Build.VERSION_CODES.N)
    	public static void main(String[] args)  {

		 class User {
            String name;
            int age;
            public User (String name, int age) {
                this.name = name;
                this.age = age;
            }
            @Override
            public String toString() {
                return "User {" +
                        "name='" + name +
                        ", age=" + age +
                        '}';
            }
			List<User > list = Arrays.asList(
                new User ("就", 25),
                new User ("bbbbbb", 25),
                new User ("啊dd", 25),
                new User ("aaaa", 25),
                new User("1", 25),
                new User("2", 25),
                new User ("a试试", 25),
                new User ("a试试", 24),
                new User ("啊aaz", 25)
        );
		 Collections.sort(list, (u1, u2) -> {
        
            int result = ToPinyin(u1.name).compareTo(ToPinyin(u2.name));
            if (result==0)
            {
                return u1.age-u2.age;
            }
            return result;
        });
         for (User user : list) {
            System.out.println(user);
        }
        }

    }
      /**
     * 汉字转为拼音
     * @param chinese
     * @return
     */
     public static String ToPinyin(String chinese) {
       return ToPinyin(chinese,"");
    }
    /**
     * 汉字转为拼音
     * @param chinese
     * @param separator 分隔符
     * @return
     */
    public static String ToPinyin(String chinese,String separator) {
        String pinyinStr = "";
        char[] newChar = chinese.toCharArray();
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);//小写
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

        for (int i = 0; i < newChar.length; i++) {
            if (newChar[i] > 128) {
                try {
                    pinyinStr += PinyinHelper.toHanyuPinyinStringArray(newChar[i],defaultFormat)[0]+separator;

                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    e.printStackTrace();

                }

            } else {
               pinyinStr += newChar[i] +separator;

            }

        }
         return pinyinStr.substring(0,pinyinStr.length()-1);

    }

}

输出:

        user{name=1, age=25}
		user{name=2, age=25}
		user{name='aaaa, age=25}
		user{name='啊aaz, age=25}
		user{name='啊dd, age=25}
		user{name='a试试, age=24}
		user{name='a试试, age=25}
		user{name='bbbbbb, age=25}
		user{name='就, age=25}

 

看到输出的结果按照我们预期想需求排列了

代码使用到了pinyin.jar,有需要的小伙伴可以点击下方链接去下载

pinyin.jar下载地址为:https://download.csdn.net/download/next_D/15839883

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将List<Object>集合(汉字、字母、数字)按照拼音来排序 的相关文章

  • 比较通用列表和数组

    为什么 generic list 比 array 慢 通用列表比数组稍慢 但在大多数情况下您不会注意到 主要与稍微复杂的查找有关 据说 List 在幕后 使用数组 但不能保证以与数组相同的方式将节点保留在相邻内存中 然而 我早在 2005
  • python 和回文

    我最近写了一个循环的方法 usr share dict words并使用我的返回回文列表ispalindrome x 方法 这是一些代码 有什么问题吗 它只会停止 10 分钟 然后返回文件中所有单词的列表 def reverse a ret
  • 将列表沿元素拆分为子列表

    我有这个清单 List
  • Python:如何将包含对象的列表保存在文件中?

    我尝试创建不同的对象 使用类和对象 并将它们保存在文件中以便稍后编辑或检索它们 然而这就是它的样子 GlobalCategories GlobalContent def LoadData x y import pickle with ope
  • 在 Python 中使用列表理解来执行类似于 zip() 的操作?

    我是一名 Python 新手 我想做的事情之一就是围绕列表理解进行思考 我可以看到这是一个非常强大的功能 值得学习 cities Chicago Detroit Atlanta airports ORD DTW ATL print zip
  • 如何从字典列表中查找键的值?

    如何从字典列表中获取给定键的值 mylist powerpoint color blue client name Sport Parents Regrouped sort order ascending chart layout 1 cha
  • 有没有办法查看 OSGi 应用程序中注册的服务?

    我有一个运行 Equinox 的 OSGi 应用程序 我想查看该应用程序提供的服务 我怎样才能做到这一点 从 gogo shell 类型 inspect cap service 这将显示所有捆绑包注册的所有服务 如果您想显示特定捆绑包的服务
  • 检查多个位置的值并仅在源唯一时返回匹配项

    假设我有一个清单Vendors 阿斯达 乐购 Spar 我有一个清单Sources 或者这个类比中的供应商 家乐氏 Kellogg 吉百利 Cadbury 雀巢 Nestle 强生 Johnsons 帮宝适 Pampers Simple 等
  • 如何将 Pandas Dataframe 中的字符串转换为字符列表或数组?

    我有一个名为的数据框data 其中一列包含字符串 我想从字符串中提取字符 因为我的目标是对它们进行一次性编码并使之可用于分类 包含字符串的列存储在预测因子如下 predictors pd DataFrame data columns Seq
  • 通过 id 从通用列表中删除对象

    我有一个像这样的域类 public class DomainClass public virtual string name get set public virtual IList
  • Java 阻止列表实现

    我在 SO 和 Google 上搜索了这个问题的答案 但到目前为止找不到合适的解决方案 我目前正在研究图形路由问题中的 LayerManager 管理器负责提供和重置一组固定的层 我想使用阻止列表来实现消费者 生产者模式 以便只要没有可用的
  • 列表到优先队列

    我有一个 C 大学编程项目 分为两个部分 在开始第二部分时应该使用priority queues hash tables and BST s 我 至少 在优先级队列方面遇到了麻烦 因为它迫使我自己重做第一部分中已经实现的许多代码 该项目是关
  • 如何在 LINQ 中执行 String.Replace?

    这是我正在尝试做的事情 但没有成功 我想打电话from x in list1 and join y in list2 where regex Match x Value Success 完成这些步骤后我需要打电话String Replace
  • 在 any() 语句中迭代一个小列表是否更快?

    在低长度迭代的限制下考虑以下操作 d 3 slice None None None slice None None None In 215 timeit any type i slice for i in d 1000000 loops b
  • Python 有不可变列表吗?

    python 有不可变列表吗 假设我希望具有元素有序集合的功能 但又想保证它不会改变 如何实现呢 列表是有序的 但它们可以改变 是的 它被称为一个tuple 所以 而不是 1 2 这是一个list并且可以突变 1 2 is a tuple并
  • 我想将对象列表添加到 firestore 文档中,-flutter

    我想将对象列表添加到 firestore 文档 我定义了产品数据模型 我还有类别数据模型 我想将类别列表添加到 firestore 中的产品文档中 我将类别添加到临时列表 然后将值放入product categories 产品 类别 类别t
  • 如何使用 tweepy 仅提取主题标签中的文本?

    我想为我的情感分析项目提取主题标签 但是我得到了一个字典列表 其中包含所有主题标签及其在推文中的索引 我只想要文字 我的代码 data tweepy Cursor api search q since a i until b i items
  • 如何在 Java 中获得列表的反向列表视图?

    我想在列表上有一个反向列表视图 与List sublist提供列表上的子列表视图 是否有一些函数可以提供此功能 我不想复制该列表 也不想修改该列表 在这种情况下 如果我能在列表上至少获得一个反向迭代器就足够了 另外 我知道如何自己实现这一点
  • 分配列表的多个值

    我很想知道是否有一种 Pythonic 方式将列表中的值分配给元素 为了更清楚 我要求这样的事情 myList 3 5 7 2 a b c d something myList So that a 3 b 5 c 7 d 2 我正在寻找比手
  • C# 如何单击 IList 中的 IWebelement?

    所以我尝试单击 YouTube 上的按钮 但我无法通过 Xpath 找到该按钮 因为按钮太多 所以我尝试将它们保存在 IList 中 现在我想单击列表中的特定按钮 ChromeDriver chrome new ChromeDriver L

随机推荐

  • coredump简介与coredump原因总结

    coredump简介与coredump原因总结 什么是coredump xff1f 通常情况下coredmp包含了程序运行时的内存 xff0c 寄存器状态 xff0c 堆栈指针 xff0c 内存管理信息等 可以理解为把程序工作的当前状态存储
  • 嵌入式设备web服务器比较

    现在在嵌入式设备中所使用的web服务器主要有 xff1a boa thttpd mini httpd shttpd lighttpd goaheand appweb和apache等 Boa 1 介绍 Boa诞生于1991年 xff0c 作者
  • memfd.c:40:12: error: static declaration of ‘memfd_create’ follows non-static declaration

    qemu编译安装出错 xff1a memfd c 40 12 error static declaration of memfd create follows non static declaration 修改 xff1a a util m
  • windows10 驱动开发环境 VS2019+WDK10

    windows10 驱动开发环境 1 下载SDK https developer microsoft com zh cn windows downloads windows 10 sdk 通用驱动demo xff1a https githu
  • 在用户配置文件中添加 IDF_PATH 和 idf.py PATH

    在用户配置文件中添加 IDF PATH 和 idf py PATH CMake 英文 注解 本文档将介绍如何使用 CMake 编译系统 目前 xff0c CMake 编译系统仍处于预览发布阶段 xff0c 如您在使用中遇到任何问题 xff0
  • error C3861: “gets”: 找不到标识符

    error C3861 gets 找不到标识 把 gets 改成 gets s 用VS2015打开一个win32工程 xff0c 生成解决方案失败 报错信息 xff1a 命令行 error D8016 ZI 和 Gy 命令行选项不兼容 选中
  • ROS和Optitrack通信

    ROS xff1a indigo Ubuntu xff1a 14 04 目的 xff1a 一台计算机通过Optitrack获得刚体 xff08 crazyflie2 0 xff09 的姿态信息并广播到同一局域网的其他计算机上 xff08 如
  • 运算放大电路(三)-加法器

    加法器 由虚短知 xff1a V 61 V 43 61 0 a 由虚断及基尔霍夫定律知 xff0c 通过R2与R1的电流之和等于通过R3的电流 xff0c 故 V1 V R1 43 V2 V R2 61 Vout V R3 b 代入a式 x
  • 一个嵌入式硬件高手的设计心得

    一 xff1a 成本节约 现象一 xff1a 这些拉高 拉低的电阻用多大的阻值关系不大 xff0c 就选个整数5K吧 点评 xff1a 市场上不存在5K的阻值 xff0c 最接近的是 4 99K xff08 精度1 xff09 xff0c
  • 跟着我从零开始入门FPGA(一周入门系列)第五

    5 同步和异步设计 前面已有铺垫 xff0c 同步就是与时钟同步 同步就是走正步 xff0c 一二一 xff0c 该迈哪个脚就迈那个脚 xff0c 跑的快的要等着跑的慢的 异步就是搞赛跑 xff0c 各显神通 xff0c 尽最大力量去跑 x
  • 硬件原理图设计规范(二)

    1 可编程逻辑器件 编号 级别 条目内容 备注 1 推荐 FPGA的LE资源利用率要保证在50 xff5e 80 之间 xff0c EPLD的MC资源的利用率要保证在50 xff5e 90 之间 对于FPGA中的锁相环 RAM 乘法器 DS
  • 嵌入式Linux应用程序开发-TCP-IP网络通信应用程序

    作为全世界最优秀的开源操作系统 xff0c Linux内部已经集成了强大的网络协议栈 xff0c 并向应用层提供丰富的系统调用 xff0c 开发者可以基于通用的系统调用接口 xff0c 使用Linux内核提供的网络功能 如果要分析Linux
  • STM32“死机“(实用调试技巧)

    2 硬件环境导致 34 死机 34 1 供电电源电压不在合适范围 单片机都需要有一个能够稳定运行的电压工作范围 xff0c 如果低于或者高于正常工作电压范围其单片机并不一定会立马无法工作 也有可能会立马死机 xff0c 而是工作一段时间在某
  • TI的ADS8320使用说明

    在调试程序的过程中遇到一个奇怪的现象 xff0c 使用ADS8320的16位AD采样温度数据 xff0c 在实际使用过程中遇到问题 xff0c 记录如下 xff1a 初始化 ADS8320 拉低片选 读取16位数据 拉高片选 使用STM32
  • [C++] 模板函数声明与实现的分离

    在使用模板时 xff0c 一般要求定义与实现在一起 xff0c 那么为了程序的统一与美观 xff0c 若想在仅在头文件中定义 xff0c 在源文件中实现 xff0c 例如 xff1a span class token comment tem
  • Android List 排序

    Android List lt Point gt 排序 1 按照x来排序 1 1升序 List points xff1b Collections sort points new Comparator 64 Override public i
  • Android反射机制

    Android反射机制实例 创建一个测试类 Person public class Person private String name 61 34 张三 34 private int age 61 15 private String de
  • 将json字符串转换为自定义对象

    将json字符串转换为自定义对象 将json转自定义对象或者List String json 61 34 34 name 34 cece 34 Gson gson 61 new Gson Person person1 61 gson fro
  • 启动一个没有注册的Activity

    废话不多说 xff0c 直接上代码 xff0c 如有不明白的可以私信留言 xff0c 一起进步 在Application 中调用即可 AndroidManifest 中已经有注册过的activity class App extends Ap
  • 将List<Object>集合(汉字、字母、数字)按照拼音来排序

    目录 将List xff1c Object xff1e 集合按照拼音来排序 1 需求 2 使用系统自带的compareTo可以排序汉字 xff0c 如果其中混入了字母 xff08 纯字母 xff09 xff0c 会直接排在汉字之前 xff0