2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 【我的Java开发学习之旅】如何实现中文汉字进行笔划(笔画)排序?

【我的Java开发学习之旅】如何实现中文汉字进行笔划(笔画)排序?

时间:2021-04-21 05:54:20

相关推荐

【我的Java开发学习之旅】如何实现中文汉字进行笔划(笔画)排序?

一、需求描述

最近有个需求,要求对列表进行排序,排序规则如下所示:

关于汉语拼音排序的很久之前就实现了,已经运行两年了。笔划排序的是刚刚要求添加的需求,因此得想办法实现中文汉字进行笔划排序。

二、如何实现中文汉字笔划排序的需求?

进过百度搜索,最终搜索到了下面的链接:

利用java对基本汉字(unicode编码4E00-9FA5)进行笔画排序

下面我们来测试下这个工具类。

2.1 测试 StringStrokeComparator排序

StringStrokeComparator排序,是对纯粹的字符串集合进行排序

2.1.1 测试程序

package com.oyp.csdn.test;import java.util.ArrayList;import java.util.Collections;import java.util.List;import com.parator.StringStrokeComparator;public class TestStringStrokeComparator {public static void main(String[] args) {List<String> name = new ArrayList<String>();name.add("欧阳鹏");name.add("阿森松島");name.add("安道爾");name.add("阿拉伯聯合大公國");name.add("阿富汗");name.add("安地卡及巴布達");name.add("安圭拉");name.add("阿爾巴尼亞");name.add("亞美尼亞");name.add("安哥拉");name.add("南極洲");name.add("阿根廷");name.add("美屬薩摩亞");name.add("奧蘭群島");name.add("波士尼亞赫塞哥維納");name.add("巴林");name.add("聖巴泰勒米");name.add("汶萊");name.add("玻利維亞");name.add("聖克里斯多福及尼維斯");name.add("朝鮮");name.add("韓國");name.add("科威特");name.add("開曼群島");name.add("哈薩克");name.add("寮國");name.add("黎巴嫩");name.add("聖露西亞");name.add("薩爾瓦多");name.add("馬約特");name.add("台灣(中國)");name.add("香港(中國)");name.add("澳門(中國)");name.add("蘇丹");//添加部分 生僻字name.add("嘣");name.add("嚋");name.add("蘇丹");name.add("哜");name.add("囆");name.add("囎");name.add("囼");name.add("圀");name.add("壝");name.add("壝");name.add("墪");name.add("夨");name.add("夒");name.add("孅");name.add("孏");name.add("孆");name.add("媘");name.add("孑");name.add("孒");name.add("孓");name.add("孖");name.add("孠");name.add("孧");name.add("滽");name.add("滽");name.add("瀶");name.add("瀶");name.add("犪");name.add("犓");name.add("犫");/** 使用 */Collections.sort(name, new StringStrokeComparator());for (String string : name) {System.out.println(string);}}}

2.1.2 测试结果

测试结果为:

孑孒孓夨巴林台灣(中國)孖安圭拉安地卡及巴布達安哥拉安道爾汶萊阿拉伯聯合大公國阿根廷阿富汗阿森松島阿爾巴尼亞亞美尼亞囼孠孧欧阳鹏波士尼亞赫塞哥維納南極洲哈薩克哜圀玻利維亞科威特美屬薩摩亞香港(中國)馬約特媘朝鮮開曼群島聖巴泰勒米聖克里斯多福及尼維斯聖露西亞嘣奧蘭群島滽滽犓墪寮國澳門(中國)黎巴嫩薩爾瓦多嚋韓國壝壝夒蘇丹蘇丹孅孆瀶瀶囆囎孏犪犫Process finished with exit code 0

2.2 测试 ObjectStrokeComparator 排序

ObjectStrokeComparator排序,可以对对象进行排序,指定使用对象的那个属性进行排序

2.2.1 测试程序

测试代码如下所示:

package com.oyp.csdn.test;import java.util.ArrayList;import java.util.Collections;import java.util.List;import com.parator.ObjectStrokeComparator;import com.junfeng.strokesort.model.Stroke;public class TestObjectStrokeComparator {public static void main(String[] args) {List<Stroke> strokes = new ArrayList<Stroke>();Stroke stroke1 = new Stroke();stroke1.setName("张三无");strokes.add(stroke1);stroke1 = new Stroke();stroke1.setName("赵明红匠");strokes.add(stroke1);stroke1 = new Stroke();stroke1.setName("李四");strokes.add(stroke1);stroke1 = new Stroke();stroke1.setName("王东栋");strokes.add(stroke1);stroke1 = new Stroke();stroke1.setName("李四仨");strokes.add(stroke1);stroke1 = new Stroke();stroke1.setName("张三");strokes.add(stroke1);stroke1 = new Stroke();stroke1.setName("欧阳鹏");strokes.add(stroke1);/** 使用 */Collections.sort(strokes, new ObjectStrokeComparator(Stroke.class, "name"));for (Stroke stroke : strokes) {System.out.println(stroke.getName());}System.out.println("----------");List<CountryOrRegion> countryOrRegionArrayList = new ArrayList<CountryOrRegion>();CountryOrRegion countryOrRegion = new CountryOrRegion();countryOrRegion.setName("阿森松島");countryOrRegionArrayList.add(countryOrRegion);countryOrRegion = new CountryOrRegion();countryOrRegion.setName("安道爾");countryOrRegionArrayList.add(countryOrRegion);countryOrRegion = new CountryOrRegion();countryOrRegion.setName("聖克里斯多福及尼維斯");countryOrRegionArrayList.add(countryOrRegion);countryOrRegion = new CountryOrRegion();countryOrRegion.setName("阿爾巴尼亞");countryOrRegionArrayList.add(countryOrRegion);countryOrRegion = new CountryOrRegion();countryOrRegion.setName("美屬薩摩亞");countryOrRegionArrayList.add(countryOrRegion);/** 使用 */Collections.sort(countryOrRegionArrayList, new ObjectStrokeComparator(CountryOrRegion.class, "name"));for (CountryOrRegion countryOrRegionItem : countryOrRegionArrayList) {System.out.println(countryOrRegionItem.getName());}System.out.println("----------");List<String> name = new ArrayList<String>();name.add("阿森松島");name.add("安道爾");name.add("阿拉伯聯合大公國");name.add("阿富汗");name.add("安地卡及巴布達");name.add("安圭拉");name.add("阿爾巴尼亞");name.add("亞美尼亞");name.add("安哥拉");name.add("南極洲");name.add("阿根廷");name.add("美屬薩摩亞");name.add("奧蘭群島");name.add("波士尼亞赫塞哥維納");name.add("巴林");name.add("聖巴泰勒米");name.add("汶萊");name.add("玻利維亞");name.add("聖克里斯多福及尼維斯");name.add("朝鮮");name.add("韓國");name.add("科威特");name.add("開曼群島");name.add("哈薩克");name.add("寮國");name.add("黎巴嫩");name.add("聖露西亞");name.add("薩爾瓦多");name.add("馬約特");name.add("台灣(中國)");name.add("香港(中國)");name.add("澳門(中國)");name.add("蘇丹");/** 使用 */Collections.sort(name, new ObjectStrokeComparator(String.class, null));for (String string : name) {System.out.println(string);}}}

其中 CountryOrRegion为自定义的一个java bean

package com.oyp.csdn.test;public class CountryOrRegion {public String getName() {return name;}public void setName(String name) {this.name = name;}/*** 国家或地区名*/private String name;@Overridepublic String toString() {return "CountryOrRegion{" +"name='" + name + '\'' +'}';}}

2.2.2 测试结果

测试结果为:

王东栋张三张三无李四李四仨欧阳鹏赵明红匠----------安道爾阿森松島阿爾巴尼亞美屬薩摩亞聖克里斯多福及尼維斯----------巴林台灣(中國)安圭拉安地卡及巴布達安哥拉安道爾汶萊阿拉伯聯合大公國阿根廷阿富汗阿森松島阿爾巴尼亞亞美尼亞波士尼亞赫塞哥維納南極洲哈薩克玻利維亞科威特美屬薩摩亞香港(中國)馬約特朝鮮開曼群島聖巴泰勒米聖克里斯多福及尼維斯聖露西亞奧蘭群島寮國澳門(中國)黎巴嫩薩爾瓦多韓國蘇丹Process finished with exit code 0

三、相关链接

jar包下载: 利用java对基本汉字(unicode编码4E00-9FA5)进行笔画排序jar包源代码下载: java汉字笔画排序源码后来找到了原作者的介绍,在此感谢。地址: /u013271384/article/details/76549368

上面的资源也可以在github上直接下载, 地址为: /ouyangpeng/ChineseStrokeSorting

扩展链接,基本实现原理:

Java中文排序完美新解

中文排序

Java汉字排序(3)按笔划排序

可以使用java.text.Collator.getInstance(Locale.TAIWAN)指定所要排序的文字,這裡指定為繁體中文。

不过感觉不准,很多顺序是乱的。

/blog/post/31662379-中文排序

获取汉字笔画,下面的文章都不靠谱,获取不到有效的笔画数。

+ [轮子]获取汉字笔画数

+ java获取汉字笔画数

+ java 汉字字典,获取汉字拼音,拼音首字母,五笔,笔画,笔画顺序

要想得到有效的笔画数,还得自己一个一个来做一个数据库。

这个数据库我弄好了,放在csdn,下载地址:

/download/qq446282412/10784680

如果你没有csdn下载币,那么我提供github地址下载吧/ouyangpeng/ChineseStrokeSorting/blob/master/jar包源代码以及demo下载/ChinessStroke.db

使用sqlite3命令打开这个db文件

内容如下所示,总共有20902个汉字,满足了日常的需求了。

直接 通过命令将这个db文件导出来。

sqlite3 ChinessStroke.dbSQLite version 3.22.0 -01-22 18:45:57Enter ".help" for usage hints.sqlite> .output ChinessStroke.datsqlite> select * from BI_HUA_BEAN;sqlite> .output stdoutsqlite>

生成的 ChinessStroke.dat文件内容如下:

下载地址:/ouyangpeng/ChineseStrokeSorting/blob/master/jar包源代码以及demo下载/ChinessStroke.dat

四、在Android上实现中文笔画排序

【我的Android进阶之旅】Android实现中文汉字笔划(笔画)排序、中文拼音排序、英文排序的国家地区选择界面

/ouyang_peng/article/details/84109727

效果如下:

简体中文:拼音排序

繁体中文:笔画排序

英文 字母排序

其他语言,显示其他语言,排序按照对应的英文名来排序

就不展示了,和刚刚我做的APP一样,现在没有可以切换其他语言的手机在身边。

github源代码地址

/ouyangpeng/ChinesePinyinSortAndStrokeSort

作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!

转载请保留原文地址:/qq446282412/article/details/83863693

如果本文对您有所帮助,欢迎您扫码下图所示的支付宝和微信支付二维码对本文进行打赏。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。