以前在外资不涉及到中文排序,目前滴滴有个需求是要按照中文首字母进行排序显示,还会有英文混合其中。
用到了一个第三方包。
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
封装了3个方法。可以根据list,map的key,map的value进行排序。返回类型与输入一致。
import net.sourceforge.pinyin4j.PinyinHelper;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class SortByChineseUtil {
public static List sort(List list) {
return sortByChinese(list);
}
public static Map sortByKey(Map map) {
ArrayList list = new ArrayList(map.keySet());
List<String> sortList = sortByChinese(list);
LinkedHashMap result = new LinkedHashMap();
for (String str : sortList) {
result.put(str, map.get(str));
}
return result;
}
public static Map sortByValue(Map map) {
List<String> list = new ArrayList<String>(map.values());
List<String> sortList = sortByChinese(list);
LinkedHashMap result = new LinkedHashMap();
for (String str : sortList) {
result.put(getKey(map, str), str);
}
return result;
}
private static String getKey(Map map, String value) {
for (Object key : map.keySet()) {
if (map.get(key).equals(value)) {
return key.toString();
}
}
return null;
}
/**
* 看是否是汉字,是汉字进行匹配
* 看是否是英文,是英文直接转成小写加进去。
* 其他则直接加
* @param list
* @return
*/
private static List sortByChinese(List<String> list) {
TreeMap map = new TreeMap();
String[] s = new String[list.size()];
for (String str : list) {
char[] chars = str.toCharArray();
if (Character.toString(chars[0]).matches("[\\u4E00-\\u9FA5]+")) {
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(chars[0]);
map.put(setMapKey(map,Character.toString(pinyinArray[0].charAt(0))), str);
} else if (Character.toString(chars[0]).matches("[a-zA-Z]+")) {
map.put(setMapKey(map,Character.toString(chars[0]).toLowerCase()), str);
} else {
map.put(setMapKey(map,Character.toString(chars[0])), str);
}
}
List<String> result = new ArrayList<String>(map.values());
return result;
}
/**
* 解决key一样会覆盖的问题
*/
private static String setMapKey(TreeMap map,String key){
if(map.get(key) == null){
return key;
}else{
return key + key;
}
}
}
测试
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("2","日本");
map.put("3","美国");
map.put(1,"中国");
map.put(77,"IT服务");
map.put(8,"it");
map.put(99,",");
System.out.println(SortByChineseUtil.sortByValue(map));
}
测试结果
{99=,, 8=it, 77=IT服务, 3=美国, 2=日本, 1=中国}
进程已结束,退出代码 0