汉字中文排序
在项目中,碰到一个问题,给省市排序。需求如下:
Map<String, List<String>>, key是省份的中文名称,value是排好序的城市列表,如
排序前: {上海=[上海], 安徽=[合肥],广东=[深圳], 湖北=[鄂州,宜昌], 福建=[福州], 吉林=[长春], 江苏=[南京, 苏州], 江西=[抚州], 辽宁=[丹东], 山东=[济南]}。
A-Z排序后: {安徽=[合肥], 福建=[福州], 广东=[深圳], 湖北=[鄂州,宜昌], 吉林=[长春], 江苏=[南京, 苏州], 江西=[抚州], 辽宁=[丹东], 山东=[济南], 上海=[上
海]}。
现在的问题是要给该Map的key(省份)按拼音顺序A-Z排序。
因为需要排序,故采用有序的TreeMap。怎么实现呢?需要自己定义一个比较器,要用到jdk中一个不怎么常用的类Collator和中文相关的一个常量java.util.Locale.CHINA。
这个比较器的代码比较简单,如下:
import java.text.Collator;
import java.util.Comparator;
/**
?* 按照拼音排序的工具类
?*
?*/
public class PinyinComparator implements Comparator<String> {
??? ?public int compare(String hanzi1, String hanzi2) {
??? ??? ?Collator cmp = Collator.getInstance(java.util.Locale.CHINA);
??? ??? ? return cmp.compare(hanzi1, hanzi2);
??? ?}
}
使用的时候如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class JustForFun {
??? /**
???? * @param args
???? */
??? public static void main(String[] args) {
??????? List<String> provinces = new ArrayList<String>();
???????
??????? provinces.add("北京");
??????? provinces.add("湖南");
??????? provinces.add("广西");
??????? provinces.add("台湾");
??????? provinces.add("香港");
??????? provinces.add("安徽");
??????? provinces.add("湖南");
??????? provinces.add("湖北");
??????? provinces.add("重庆");
??????? provinces.add("上海");?????????????
???????
??????? Map<String, List<String>> result = new TreeMap<String, List<String>>(new PinyinComparator());
??????? for(String province : provinces){
??????? ??? result.put(province, new ArrayList<String>());
??????? }
???????
??????? for(String key : result.keySet()){
??????? ??? System.out.println(key);
??????? }??????
??? }
}
排序后的结果如下:
安徽
北京
广西
湖北
湖南
上海
台湾
香港
重庆
但是这个方法还是有不爽的地方,就是对多音字的处理不够智能。如“重庆”读“chongqing”,应该排在北京之后,但现在被处理成了“zhongqing”,排到了最后。
要处理这种情况,有两种方案:
1.??? 改进jdk中Collator和java.util.Locale.CHINA的代码,实现多音字的分情境处理。比如说区分“重”什么情况下该读“chong”,什么情况下该读“zhong”
2.??? 把省份定义成一个类,有中文和拼音两个属性,比较的时候直接用拼音(字符串),但Map<String, List<String>>的key还是用省份的中文属性
综合考虑,还是方案2比较靠谱!