最近项目上使用到汉字排序的问题,网上搜索了一下后普遍使用下面的方法比较。
- @Test
- public void test_sort_pinyin() {
- Collator cmp = Collator.getInstance(java.util.Locale.CHINA);
- String[] arr = { "张三", "李四", "王五", "赵六", "JAVA", "123", "$%$#", "哈哈A",
- "1哈哈A", "1哈哈b", "1哈哈a", "哈哈", "哈", "怡情" };
- List<String> list = Arrays.asList(arr);
- Arrays.sort(arr, cmp);
- System.out.println(list);
- }
输出结果如下:
[$%$#, 123, 1哈哈a, 1哈哈A, 1哈哈b, JAVA, 哈, 哈哈, 哈哈A, 李四, 王五, 张三, 赵六, 怡情]
发现了有个BUG,因为网上也看到一些朋友提出问题,所以测试时故意加上怡字。发现“怡”字果然最后了。所以只能再寻找解决办法。后来想起了之前把中文自动转拼音时使用到的类。
pinyin4j 开源项目 具体可以查看 http://pinyin4j.sourceforge.net/
真的不得不感谢这位人士。
封装成比较器后代码如下:
- import java.util.Comparator;
- import net.sourceforge.pinyin4j.PinyinHelper;
- /**
- * 汉字按照拼音排序的比较器
- * @author KennyLee 2009-2-23 10:08:59
- *
- */
- public class PinyinComparator implements Comparator<Object> {
- public int compare(Object o1, Object o2) {
- char c1 = ((String) o1).charAt(0);
- char c2 = ((String) o2).charAt(0);
- return concatPinyinStringArray(
- PinyinHelper.toHanyuPinyinStringArray(c1)).compareTo(
- concatPinyinStringArray(PinyinHelper
- .toHanyuPinyinStringArray(c2)));
- }
- private String concatPinyinStringArray(String[] pinyinArray) {
- StringBuffer pinyinSbf = new StringBuffer();
- if ((pinyinArray != null) && (pinyinArray.length > 0)) {
- for (int i = 0; i < pinyinArray.length; i++) {
- pinyinSbf.append(pinyinArray[i]);
- }
- }
- return pinyinSbf.toString();
- }
- }
继续执行测试
- @Test
- public void test_sort_pinyin2() {
- String[] arr = { "张三", "李四", "王五", "赵六", "JAVA", "123", "$%$#", "哈哈A",
- "1哈哈A", "1哈哈b", "1哈哈a", "哈哈", "哈", "怡情" };
- List<String> list = Arrays.asList(arr);
- Arrays.sort(arr, new PinyinComparator());
- System.out.println(list);
- }
最终打印效果如下:
[JAVA, 123, $%$#, 1哈哈A, 1哈哈b, 1哈哈a, 哈哈A, 哈哈, 哈, 李四, 王五, 怡情, 张三, 赵六]
不过也由此看出,对于符号等其他排序也有一些争议的地方,但是关系不大。或者也可以再判断一下首字是否为中文,若不是再按照其他相应的比较方式。比较器的好处就是可以自定义了。
例子中只是用了数组进行排序,但可能较多的情况下遇到的是对List的排序,即List<Object>。同样的可以举一反三的修改比较器中的compare方法,只要提取用来排序的的汉字关键字段出来即可。
然后比较的时候调用
Collections.sort(list,new PinyinComparator());
而且注意例子中只是截取了首汉字进行排序,若需要可以进一步的排序。
但主要还是中文的排序确实正确了。
基本原理:
其实弄来弄去,原理还是把汉字转成拼音,然后再进行排序罢了。所以如果在项目中有遇到过需要把汉字转换成拼音的需求的话。碰到汉字排序的话问题自然也会迎刃而解。
也不得不感叹一句,在中国做研发比外国要辛苦啊。起码字符集就多了那么多,而且也没得到很多基本的支持,然后引发的一连串问题。例如乱码,汉字排序,转拼音等什么的...
不过解决一个记下一个吧,以后就能直接使用了,算多学一点。
最近项目上使用到汉字排序的问题,网上搜索了一下后普遍使用下面的方法比较。
- @Test
- public void test_sort_pinyin() {
- Collator cmp = Collator.getInstance(java.util.Locale.CHINA);
- String[] arr = { "张三", "李四", "王五", "赵六", "JAVA", "123", "$%$#", "哈哈A",
- "1哈哈A", "1哈哈b", "1哈哈a", "哈哈", "哈", "怡情" };
- List<String> list = Arrays.asList(arr);
- Arrays.sort(arr, cmp);
- System.out.println(list);
- }
输出结果如下:
[$%$#, 123, 1哈哈a, 1哈哈A, 1哈哈b, JAVA, 哈, 哈哈, 哈哈A, 李四, 王五, 张三, 赵六, 怡情]
发现了有个BUG,因为网上也看到一些朋友提出问题,所以测试时故意加上怡字。发现“怡”字果然最后了。所以只能再寻找解决办法。后来想起了之前把中文自动转拼音时使用到的类。
pinyin4j 开源项目 具体可以查看 http://pinyin4j.sourceforge.net/
真的不得不感谢这位人士。
封装成比较器后代码如下:
- import java.util.Comparator;
- import net.sourceforge.pinyin4j.PinyinHelper;
- /**
- * 汉字按照拼音排序的比较器
- * @author KennyLee 2009-2-23 10:08:59
- *
- */
- public class PinyinComparator implements Comparator<Object> {
- public int compare(Object o1, Object o2) {
- char c1 = ((String) o1).charAt(0);
- char c2 = ((String) o2).charAt(0);
- return concatPinyinStringArray(
- PinyinHelper.toHanyuPinyinStringArray(c1)).compareTo(
- concatPinyinStringArray(PinyinHelper
- .toHanyuPinyinStringArray(c2)));
- }
- private String concatPinyinStringArray(String[] pinyinArray) {
- StringBuffer pinyinSbf = new StringBuffer();
- if ((pinyinArray != null) && (pinyinArray.length > 0)) {
- for (int i = 0; i < pinyinArray.length; i++) {
- pinyinSbf.append(pinyinArray[i]);
- }
- }
- return pinyinSbf.toString();
- }
- }
继续执行测试
- @Test
- public void test_sort_pinyin2() {
- String[] arr = { "张三", "李四", "王五", "赵六", "JAVA", "123", "$%$#", "哈哈A",
- "1哈哈A", "1哈哈b", "1哈哈a", "哈哈", "哈", "怡情" };
- List<String> list = Arrays.asList(arr);
- Arrays.sort(arr, new PinyinComparator());
- System.out.println(list);
- }
最终打印效果如下:
[JAVA, 123, $%$#, 1哈哈A, 1哈哈b, 1哈哈a, 哈哈A, 哈哈, 哈, 李四, 王五, 怡情, 张三, 赵六]
不过也由此看出,对于符号等其他排序也有一些争议的地方,但是关系不大。或者也可以再判断一下首字是否为中文,若不是再按照其他相应的比较方式。比较器的好处就是可以自定义了。
例子中只是用了数组进行排序,但可能较多的情况下遇到的是对List的排序,即List<Object>。同样的可以举一反三的修改比较器中的compare方法,只要提取用来排序的的汉字关键字段出来即可。
然后比较的时候调用
Collections.sort(list,new PinyinComparator());
而且注意例子中只是截取了首汉字进行排序,若需要可以进一步的排序。
但主要还是中文的排序确实正确了。
基本原理:
其实弄来弄去,原理还是把汉字转成拼音,然后再进行排序罢了。所以如果在项目中有遇到过需要把汉字转换成拼音的需求的话。碰到汉字排序的话问题自然也会迎刃而解。
也不得不感叹一句,在中国做研发比外国要辛苦啊。起码字符集就多了那么多,而且也没得到很多基本的支持,然后引发的一连串问题。例如乱码,汉字排序,转拼音等什么的...
不过解决一个记下一个吧,以后就能直接使用了,算多学一点。
最近项目上使用到汉字排序的问题,网上搜索了一下后普遍使用下面的方法比较。
- @Test
- public void test_sort_pinyin() {
- Collator cmp = Collator.getInstance(java.util.Locale.CHINA);
- String[] arr = { "张三", "李四", "王五", "赵六", "JAVA", "123", "$%$#", "哈哈A",
- "1哈哈A", "1哈哈b", "1哈哈a", "哈哈", "哈", "怡情" };
- List<String> list = Arrays.asList(arr);
- Arrays.sort(arr, cmp);
- System.out.println(list);
- }
输出结果如下:
[$%$#, 123, 1哈哈a, 1哈哈A, 1哈哈b, JAVA, 哈, 哈哈, 哈哈A, 李四, 王五, 张三, 赵六, 怡情]
发现了有个BUG,因为网上也看到一些朋友提出问题,所以测试时故意加上怡字。发现“怡”字果然最后了。所以只能再寻找解决办法。后来想起了之前把中文自动转拼音时使用到的类。
pinyin4j 开源项目 具体可以查看 http://pinyin4j.sourceforge.net/
真的不得不感谢这位人士。
封装成比较器后代码如下:
- import java.util.Comparator;
- import net.sourceforge.pinyin4j.PinyinHelper;
- /**
- * 汉字按照拼音排序的比较器
- * @author KennyLee 2009-2-23 10:08:59
- *
- */
- public class PinyinComparator implements Comparator<Object> {
- public int compare(Object o1, Object o2) {
- char c1 = ((String) o1).charAt(0);
- char c2 = ((String) o2).charAt(0);
- return concatPinyinStringArray(
- PinyinHelper.toHanyuPinyinStringArray(c1)).compareTo(
- concatPinyinStringArray(PinyinHelper
- .toHanyuPinyinStringArray(c2)));
- }
- private String concatPinyinStringArray(String[] pinyinArray) {
- StringBuffer pinyinSbf = new StringBuffer();
- if ((pinyinArray != null) && (pinyinArray.length > 0)) {
- for (int i = 0; i < pinyinArray.length; i++) {
- pinyinSbf.append(pinyinArray[i]);
- }
- }
- return pinyinSbf.toString();
- }
- }
继续执行测试
- @Test
- public void test_sort_pinyin2() {
- String[] arr = { "张三", "李四", "王五", "赵六", "JAVA", "123", "$%$#", "哈哈A",
- "1哈哈A", "1哈哈b", "1哈哈a", "哈哈", "哈", "怡情" };
- List<String> list = Arrays.asList(arr);
- Arrays.sort(arr, new PinyinComparator());
- System.out.println(list);
- }
最终打印效果如下:
[JAVA, 123, $%$#, 1哈哈A, 1哈哈b, 1哈哈a, 哈哈A, 哈哈, 哈, 李四, 王五, 怡情, 张三, 赵六]
不过也由此看出,对于符号等其他排序也有一些争议的地方,但是关系不大。或者也可以再判断一下首字是否为中文,若不是再按照其他相应的比较方式。比较器的好处就是可以自定义了。
例子中只是用了数组进行排序,但可能较多的情况下遇到的是对List的排序,即List<Object>。同样的可以举一反三的修改比较器中的compare方法,只要提取用来排序的的汉字关键字段出来即可。
然后比较的时候调用
Collections.sort(list,new PinyinComparator());
而且注意例子中只是截取了首汉字进行排序,若需要可以进一步的排序。
但主要还是中文的排序确实正确了。
基本原理:
其实弄来弄去,原理还是把汉字转成拼音,然后再进行排序罢了。所以如果在项目中有遇到过需要把汉字转换成拼音的需求的话。碰到汉字排序的话问题自然也会迎刃而解。
也不得不感叹一句,在中国做研发比外国要辛苦啊。起码字符集就多了那么多,而且也没得到很多基本的支持,然后引发的一连串问题。例如乱码,汉字排序,转拼音等什么的...
不过解决一个记下一个吧,以后就能直接使用了,算多学一点。
相关推荐
java集合某个字段按照中文拼音排序 java集合某个字段按照中文拼音排序
主要是对java中将汉字按照拼音排序的实现代码进行了详细的分析介绍。需要的朋友可以过来参考下,希望对大家有所帮助
java实现中文排序,按数字字母汉字的顺序进行排序
4. * 汉字按照拼音排序的比较器 5. * @author KennyLee 2009-2-23 10:08:59 6. * 7. */ 8.public class PinyinComparator implements Comparator<Object> { 9. public int compare(Object o1, Object o2) { 10...
java 获取汉字拼音首字母 源码 /** * GB 2312-80 把收录的汉字分成两级。第一级汉字是常用汉字,计 3755 个, 置于 16~55 * 区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字, 计 3008 个,置于 56~...
使用pinyin4j制作的一个简单的中文拼音排序
java的拼音解析,用于java开发对,汉字按拼音首字母排序,识别汉字并以拼音形式展现等
chineseandpinyin 是一个 Java 的类库,实现了汉字转拼音的功能。 目前2.0.0版已经Release,主要功能有: ... 实现小巧严谨的拼音排序,中英混合排序. 更多详情请见:http://51isunshine.github.io/chineseandpinyin/
本文实例讲述了Java编程实现中英混合字符串数组按首字母排序的方法。分享给大家供大家参考,具体如下: 在Java中对于字符串数组的排序,我们可以使用Arrays.sort(String[])方法很便捷的进行排序。例如: String[]...
实现按拼音排序... 按A到Z,可点击选择~.. 详情看效果~
sql按拼音首字母排序,sql按拼音排序
今天在代码中用到了对中文按照拼音排序,咨询了群里面的大神后得到了下面的代码: var arr = ["张三","李四","王五","阿三"]; [removed](arr+" "); arr.sort(function(a,b){ return a.localeCompare(b); }); ...
pinyin4j-2.5.0.jar用于将汉字转拼音,用于实际项目汉字排序、汉字分类等功能
主要介绍了Java实现按中文首字母排序的具体实例,有需要的朋友可以参考一下
一经测试能将所有汉字转换为拼音,并可以使用它将汉字进行拼音排序!
通过里面的工具类,可以方便的进行拼音,笔画排序,并且对java的排序类进行了修复,可以精确的对UTF-8所支持的所有汉字排序。
PinyinHelper.convertToPinyinString(str,"",PinyinFormat.WITHOUT_TONE)输出拼音不包含声调 PinyinHelper.getShortPinyin(str) 获得简拼 PinyinHelper.convertToPinyinString(str,",",PinyinFormat.WITH_TONE_...
MySQL常规排序、自定义排序和按中文拼音字母排序,在实际的SQL编写时,我们有时候需要对条件集合进行排序。 下面给出3种比较常用的排序方式,mark一下 1.常规排序ASC DESC ASC 正序 DESC倒叙 — 此处不用多讲 2....
最近在做一个按拼音首字母排序的ListView需要取汉字拼音首字母,做了如下的方法:
像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...