徐师兄这次开门见山上代码!由于没时间整理直接controller层写了一个测试代码
@RequestMapping(value = "/get", method = RequestMethod.GET)
public Object get(){
List<Map<String, Object>> list = testMapper.get();
List<String> nameList =
list.stream()
.map(element->element.get("buildingName").toString().substring(0, 1))
.map(i-> PinyinUtils.converterToFirstSpell(i).toLowerCase())
.sorted()
.collect(Collectors.toList());
System.out.println(Arrays.toString(nameList.toArray()));
System.out.println(nameList.size());
Comparator comparator = Collator.getInstance(Locale.CHINA);
Collections.sort(list, (p1, p2) -> comparator.compare(PinyinUtils.converterToFirstSpell(p1.get("buildingName").toString().substring(0,1)).toLowerCase(),
PinyinUtils.converterToFirstSpell(p2.get("buildingName").toString().substring(0,1)).toLowerCase()));
list.stream().forEach(System.out::println);
return nameList;
}
这个是为了处理返回的list 里面的需要根据buildingName这个字段进行首字母排序,而且字段值有中文有英文;
这时候有人就要去百度 但是百度查的附上链接https://blog.csdn.net/yh869585771/article/details/84964393但是人家说了“如果name这个字段有英文,那么将排到所有汉字前面,总体来说,优先级是:英文字母>汉字”,显然不符合咱们的需求!另外发现 对于
嗯嗯的处理不了百度一下发现居然不读en!
以下来自百度百科:
普通话标准发音:
许多人常把“嗯”与“恩”的拼音及发音混为一谈。把“嗯”的拼音误会成“en”,实际无论翻新老字典“嗯”的拼音一直是“ng”,“恩”的拼音才是“en”。
从字的结构可得知“嗯(ng)”的用途在于日常交谈中的语气辅助。那“嗯(ng)”的发音怎么读呢?很简单,只需要紧闭双唇后使用鼻腔哼鸣发音即可发出“嗯(ng)”的音。
好吧 即使这样也不至于处理不了 直接把嗯开头的放到最后面!!下面徐师兄根据之前的经验有一个汉字转换拼音的工具包,立马就来了想法 排序的时候获取字段的第一个字,英文就是第一个字母,进行比较排序;徐师兄还特意测试了一下汉字取第一个字节是不是完整的 结果取出来是完整的一个汉字,因为考虑到:一个汉字多少字节?这个问题一个汉字多少字节连接在此 点开即可享用
String test = "这是汉字";
String test1 = "zhe shi";
System.out.println(test.substring(0, 1));
System.out.println(test1.substring(0, 1));
// 结果
这
z
然后思路就来了,根据第一个字的首字母排序
Comparator comparator = Collator.getInstance(Locale.CHINA);
Collections.sort(list, (p1, p2) -> comparator.compare(PinyinUtils.converterToFirstSpell(p1.get("buildingName").toString().substring(0,1)).toLowerCase(),
PinyinUtils.converterToFirstSpell(p2.get("buildingName").toString().substring(0,1)).toLowerCase()));
list.stream().forEach(System.out::println);
搞定了~
附上pinyin4j的maven依赖:
<!-- https://mvnrepository.com/artifact/com.belerweb/pinyin4j -->
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.0</version>
</dependency>
常用工具类:
public class PinyinUtils {
/**
* 获得汉语拼音首字母
*
* @param chines 汉字
* @return
*/
public static String getAlpha(String chines) {
String pinyinName = "";
char[] nameChar = chines.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < nameChar.length; i++) {
if (nameChar[i] > 128) {
try {
pinyinName += PinyinHelper.toHanyuPinyinStringArray(
nameChar[i], defaultFormat)[0].charAt(0);
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pinyinName += nameChar[i];
}
}
return pinyinName;
}
/**
* 将字符串中的中文转化为拼音,英文字符不变
*
* @param inputString 汉字
* @return
*/
public static String getPingYin(String inputString) {
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
format.setVCharType(HanyuPinyinVCharType.WITH_V);
String output = "";
if (inputString != null && inputString.length() > 0
&& !"null".equals(inputString)) {
char[] input = inputString.trim().toCharArray();
try {
for (int i = 0; i < input.length; i++) {
if (java.lang.Character.toString(input[i]).matches(
"[\\u4E00-\\u9FA5]+")) {
String[] temp = PinyinHelper.toHanyuPinyinStringArray(
input[i], format);
output += temp[0];
} else
output += java.lang.Character.toString(input[i]);
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
return "*";
}
return output;
}
/**
* 汉字转换位汉语拼音首字母,英文字符不变
*
* @param chines 汉字
* @return 拼音
*/
public static String converterToFirstSpell(String chines) {
String pinyinName = "";
char[] nameChar = chines.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < nameChar.length; i++) {
if (nameChar[i] > 128) {
try {
pinyinName += PinyinHelper.toHanyuPinyinStringArray(
nameChar[i], defaultFormat)[0].charAt(0);
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pinyinName += nameChar[i];
}
}
return pinyinName;
}
public static void main(String[] args) {
System.out.println(converterToFirstSpell("业户名称"));
//带括号的不行
//System.out.println(getAlpha("吨(座)位"));
System.out.println(getPingYin("业户名称"));
}
public static JSONObject transforToEnglishJsonObjectTransport(JSONObject jsonObject){
//TODO 过滤特殊汉字
String dunCount = StringUtil.objToString(jsonObject.remove("吨(座)位"));
//fastjson解析方法
JSONObject newObject = new JSONObject();
newObject.put("dunCount", dunCount);
//下面遍历操作 不允许remove put 操作
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
String key = entry.getKey();
String value = StringUtil.objToString(entry.getValue());
// jsonObject.remove(key);
String newKey = PinyinUtils.getPingYin(key);
newObject.put(newKey, value);
}
return newObject;
}
}