最近由于工作需要需要对中文汉字排序,编写了Comparator实现类分享给大家。

直接上代码:


import java.util.Comparator;public class ChineseComparator<T> implements Comparator<T> {private static boolean isDigit(char ch) {return ch >= 48 && ch <= 57;}/*** Length of string is passed in for improved efficiency (only need to calculate it once)**/private static String getChunk(String s, int slength, int marker) {StringBuilder chunk = new StringBuilder();int index = marker;char c = s.charAt(index);chunk.append(c);index++;if (isDigit(c)) {while (index < slength) {c = s.charAt(index);if (!isDigit(c)) {break;}chunk.append(c);index++;}} else {while (index < slength) {c = s.charAt(index);if (isDigit(c)) {break;}chunk.append(c);index++;}}return chunk.toString();}@Overridepublic int compare(Object o1, Object o2) {if (!(o1 instanceof String) || !(o2 instanceof String)) {return 0;}String s1 = (String) o1;String s2 = (String) o2;return compareString(s1,s2);}public static int compareString(String s1,String s2){if(s1 == null){return 1;}if(s2 == null){return -1;}int thisMarker = 0;int thatMarker = 0;int s1Length = s1.length();int s2Length = s2.length();while (thisMarker < s1Length && thatMarker < s2Length) {String thisChunk = getChunk(s1, s1Length, thisMarker);thisMarker += thisChunk.length();String thatChunk = getChunk(s2, s2Length, thatMarker);thatMarker += thatChunk.length();//如果两个字符块都是数字,则按数字排序int result;if (isDigit(thisChunk.charAt(0)) && isDigit(thatChunk.charAt(0))) {result = compareDigit(thisChunk,thatChunk);if (result != 0) {return result;}} else {result = thisChunk.compareTo(thatChunk);}if (result != 0) {return result;}}return s1Length - s2Length;}/*** 按数字比较*/private static int compareDigit(String thisChunk,String thatChunk){int thisChunkLength = thisChunk.length();int result = thisChunkLength - thatChunk.length();if (result == 0) {//诸位比较for (int i = 0; i < thisChunkLength; i++) {result = thisChunk.charAt(i) - thatChunk.charAt(i);if (result != 0) {return result;}}}return result;}}

使用方法:

    public static void main(String[] args) {Map<String, Object> map = new HashMap<String, Object>();map.put("name", "高一(1)班");map.put("age", 13);Map<String, Object> map2 = new HashMap<String, Object>();map2.put("name", "高一(11)班");map2.put("age", 15);Map<String, Object> map3 = new HashMap<String, Object>();map3.put("name", "高一(1)班");map3.put("age", 20);Map<String, Object> map4 = new HashMap<String, Object>();map4.put("name", "高一(2)班");map4.put("age", 18);List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();list.add(map);list.add(map2);list.add(map3);list.add(map4);System.out.println("排序前:"+list);List<Map> collect =list.stream().sorted((o1, o2) -> ChineseComparator.compareString(o1.get("name")+"",o2.get("name")+"")).collect(Collectors.toList());System.out.println("排序后:"+collect);}

运行结果如下:

Java8对中文汉字排序的Comparator实现类相关推荐

  1. Java数组中文排序_Java模块 -- 数组/集合中文汉字排序(支持生僻汉字)

    这里举例List集合 , 对list中的中文进行排序 , 按照中文拼音首字母. 支持生僻汉字的话 , 需要使用一个jar包 , 链接地址如下 传统的 : List list = new ArrayLi ...

  2. Java中文汉字排序

    概述 我们在应用程序中可能会经常遇到对中文排序的问题,例如姓名列表,词汇表等等.对中文排序,我们使用比较多的是根据汉语拼音发音来确定顺序. 我们可能会经常使用 java.util.Set接口, jav ...

  3. MySQL根据中文汉字排序查询

    在MySQL中当说到进行排序查询时,大家的第一反应就是使用 ORDER BY 方法指定列进行排序,但是如果要指定列为中文数据按照首字母排序时,就会发现 ORDER BY 方法排序的顺序其实是有问题的. ...

  4. mysql按中文汉字排序

    SELECT * FROM [表名] order by CONVERT([字段] USING gbk) https://blog.csdn.net/jay168999/article/details/ ...

  5. java实现中文汉字按首字母排序

    要实现汉字按首字母排序,主要是设置语言环境,如下语句设置语言环境: 这里用到了Collator类,此类实现了Comparator接口,用他的getInstance就可以用指定的语言环境来构造一个Col ...

  6. Java字母笔顺_Android实现中文汉字笔划(笔画)、中文拼音排序、英文排序

    一.需求描述 最近要做一个类似微信的,在登录界面选择国家地区的功能,微信有中文汉字笔画排序以及中文拼音排序等几种方式,如下所示: 微信:简体中文.拼音排序 微信:繁体中文.笔画排序 微信 英文 字母排 ...

  7. Java比较、排序处理含有中文/汉字的字符串

    目录 引言 一.方案一 1.依赖引入 2.完整代码(含注解) 3.验证测试 测试 isHanZi() 测试 compareCharWithHanZi() 测试 compareStringWithHan ...

  8. Android实现中文汉字笔划(笔画)、中文拼音排序、英文排序

    发布时间:2018-11-16 技术:Android 概述 最近要做一个类似微信的,在登录界面选择国家地区的功能,微信有中文汉字笔画排序以及中文拼音排序等几种方式,如下所示: 简体中文 拼音排序;繁体 ...

  9. 汉字转拼音,中文拼音排序器

    汉字转拼音 NSMutableString *ms = [[NSMutableString alloc] initWithString:@"我是中国人"]; if (CFStrin ...

最新文章

  1. 资源 |​ 史上最全机器学习笔记
  2. 2020牛客多校G[并查集的两种思想,按秩合并+路径压缩]
  3. nodejs 循环中操作需要同步执行解决方案
  4. VIM使用系列:转换文本大小写
  5. vue调用手机相机相册_详解Vue调用手机相机和相册以及上传
  6. ospf 环回口的路由条目_华为OSPF基础实验
  7. 更改via浏览器字体_【安卓】我心中的最佳手机浏览器
  8. Linux系统中的用户管理(一)
  9. 轮播图背景图铺满整个div
  10. easyUi combobox setValue 引起的关于js的坑
  11. 第50篇-企查查请求头参数分析【2022-09-29】
  12. 集成redis,删除key报“srem“异常
  13. 酷睿i7 12700k和i7 12700kf的区别 i712700k和i712700kf差多少
  14. 中国跨5个时区,东南西北的极点坐标信息
  15. html使div内部元素水平排列_实现元素水平排列的六种方法
  16. Java一维数组和二维数组的长度
  17. ZigBee-CC2530单片机 - 实现计算机串口通讯控制LED发光二极管
  18. 腾讯在线教育互动课堂——Demo调试过程记录
  19. BEA WebLogic Workshop 8.1中文语言包
  20. ubuntu下使用360wifi2做无线网卡

热门文章

  1. Kafka的高吞吐率是怎么实现的
  2. 作业一(编译、汇编、翻译以及方舟编译器)
  3. Qt [GC9-13]:HUD-转向灯、速度表、背景透明处理
  4. android游戏手机评测,黑鲨游戏手机Helo评测:不是二代 但改良不亚于新生
  5. 【基础dp】HRBUST 1861 猥琐宅男——koko
  6. word文档小方格怎么弄_如何在WORD文档中的小方格里打对勾,独家教程在这里,WORD中的小方框...
  7. 阿里云李飞飞:云数据库成行业事实标准,瑶池正在带领国产数据库换道超车
  8. 电动汽车充电站(桩)控制系统解决方案
  9. C语言中signal函数简介及使用
  10. web第八课:图片标签的路径和属性