如图,根据微信中文名字首字母排序。
中文转拼音 pinyin4j:
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
public static void main(String[] args) {
Map<Character, List<String>> map = new ConcurrentHashMap<>();
String[] names = new String[] { "张三", "吧的", "李四", "王五", "赵六", "a测试", "中国", "美", "111", "***", "彭万里", "高大山",
"孙旭诚", "孙邦原", "11" };
Arrays.stream(names).forEach(c -> {
// 汉字
if (isChineseChar(c.charAt(0))) {
String[] pStr = PinyinHelper.toHanyuPinyinStringArray(c.charAt(0));
char charAt = pStr[0].toUpperCase().charAt(0);
addToMap(map, charAt, c);
} else if (isEnglishChar(c.charAt(0))) { // 英文字母
char charAt = c.toUpperCase().charAt(0);
addToMap(map, charAt, c);
} else { // 其他
addToMap(map, '#', c);
}
});
Map<Character, List<String>> mapAscSort = mapAscSort(map);
String json = new Gson().toJson(mapAscSort);
System.out.println(json);
}
private static void addToMap(Map<Character, List<String>> map, char key, String value) {
if (map.containsKey(key)) {
List<String> list = map.get(key);
list.add(value);
} else {
List<String> arrayList = new ArrayList<>();
arrayList.add(value);
map.put(key, arrayList);
}
}
private static Map<Character, List<String>> mapAscSort(Map<Character, List<String>> map) {
Map<Character, List<String>> linkedHashMap = new LinkedHashMap<>();
map.keySet().stream().filter(c -> !c.equals('#')).sorted((o1, o2) -> o1.compareTo(o2)).forEach(c -> {
linkedHashMap.put(c, map.get(c));
});
linkedHashMap.put('#', map.get('#'));
return linkedHashMap;
}
private static boolean isChineseChar(char c) {
return String.valueOf(c).matches("[\u4e00-\u9fa5]");
}
private static boolean isEnglishChar(char c) {
return String.valueOf(c).matches("^[A-Za-z]+$");
}
最终效果: