[转]Java汉字按照拼音排序
最近项目上使用到汉字排序的问题,网上搜索了一下后普遍使用下面的方法比较。
@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/ 使用的是:pinyin4j-2.5.0.jar 这个包;
真的不得不感谢这位人士。
封装成比较器后代码如下:
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());
而且注意例子中只是截取了首汉字进行排序,若需要可以进一步的排序。
但主要还是中文的排序确实正确了。
基本原理:
其实弄来弄去,原理还是把汉字转成拼音,然后再进行排序罢了。所以如果在项目中有遇到过需要把汉字转换成拼音的需求的话。碰到汉字排序的话问题自然也会迎刃而解。
也不得不感叹一句,在中国做研发比外国要辛苦啊。起码字符集就多了那么多,而且也没得到很多基本的支持,然后引发的一连串问题。例如乱码,汉字排序,转拼音等什么的...
不过解决一个记下一个吧,以后就能直接使用了,算多学一点。
转自:http://blog.csdn.net/kennylee26/article/details/3926168
[转]Java汉字按照拼音排序的更多相关文章
- MySQL按照汉字的拼音排序
按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序: 如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字37 ...
- MySQL按照汉字的拼音排序,mysql汉字排序
按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序: 如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字37 ...
- MySQL按照汉字的拼音排序(转)
按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序: 如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字37 ...
- MySQL按照汉字的拼音排序、按照首字母分类
项目中有时候需要按照汉字的拼音排序,比如联系人列表.矿物分类等,有的还需要按拼音字母从A到Z分类显示. 如果存储汉字的字段编码使用的是GBK字符集,因为GBK内码编码时本身就采用了拼音排序的方法(常用 ...
- TP5 按照汉字的拼音排序
业务需求:接口返回一个列表,但是这个列表要求按一定的条件排序,条件如下: 1,某字段(field1)为null的排前面 2,某字段(field2)为null的排前面 3,姓名(field3)按照汉字的 ...
- java汉字转拼音以及得到首字母通用方法
package oa.common.utils; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.piny ...
- java 汉字转拼音
先决条件: pinyin4j.jar(Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换.拼音输出格式可以定制.) 下载地址:http://pan.baidu.com/share/l ...
- js中文汉字按拼音排序
JavaScript 提供本地化文字排序,比如对中文按照拼音排序,不需要程序显示比较字符串拼音. String.prototype.localeCompare 在不考虑多音字的前提下,基本可以完美实现 ...
- java汉字转拼音的工具类
import com.google.common.base.Strings;import net.sourceforge.pinyin4j.PinyinHelper;import net.source ...
随机推荐
- C语言简单strcat和strcmp的实现
对于C标准库中的字符串处理函数应该平常用的比较多:简单实现strcat和strcmp _strcpy: char *_strcpy(char *dest, char *src) { char *buf ...
- UVA 11045-My T-shirt suits me(二分图匹配)
题意:有N件T恤,N是6的倍数,因为有6种型号,每种件数相同,有M个人,每个人有两种型号的T恤适合他,每个人可以挑其中的一种,问能否所有的人都能分配到T恤. 解析:典型的二分图匹配,每N/6为同种T恤 ...
- 关于#ifndef,#define,#end的说明
#ifndef,#define,#end 是宏定义的一种---条件编译 这样我直接举个例子好了:我定义两个相同的类A分别在single.h和singlenew.h single.h: #include ...
- Unity 改变类模板-为你的类添加一个命名空间
之前在写代码的时候,就很疑惑为什么创建类的时候.没有命名空间呢? 后来自己的类终于和别人写的类名字有冲突.... 如何修改Unity创建类的模板呢? 找到下面这个文件 然后修改 保存文件在Uni ...
- C++类构造函数
一.概述 类是一种用户自定义的类型,声明一个类对象时,编译程序要为对象分配存储空间,进行必要的初始化.在C++中,这项工作是由构造函数来完成的. 大部分对象在使用之前没有正确的初始化是C++出错的主要 ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源代码放送
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- ARM9嵌入式学习笔记(2)-Vi使用
ARM9嵌入式学习笔记(2) 实验1-1-3 Vi使用 vi创建文件vi hello.c:vi smb.conf-打开文件smb.conf i键-插入模式:esc键-命令行模式::-底行模式: 底行模 ...
- HTML5新增的主体元素和新增的非主体结构元素
HTML5新增的主体元素 article元素 article元素表示文档.页面或应用程序中独立的.完整的.可以独自被外部引用的内容.它可以是一篇博客或者报刊中的文章,一篇论坛帖子.一段用户评论或独立的 ...
- ScriptManager需要用到的JS
<script type="text/javascript"> Sys.Application.add_load(function() { var form = Sys ...
- oracle数据库10g下载地址
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Microsoft Windows (32-bit ...