目录
2.使用系统自带的compareTo可以排序汉字,如果其中混入了字母(纯字母),会直接排在汉字之前,一起来看一下下面的例子
将List<Object>集合按照拼音来排序
1.需求
混合排列 汉字、字母、数字,数字排在最前,字母跟汉字统一按照升序(a-z)来排列
2.使用系统自带的compareTo可以排序汉字,如果其中混入了字母(纯字母),会直接排在汉字之前,一起来看一下下面的例子
2.1.数组排序:
String[] li = new String[]{
"啊", "好", "bbb"
};
Arrays.sort(li);
for (String s : li) {
System.out.println(s);
}
会输出:
bbb
啊
好
从打印结果看,bbb在 啊 之前,明显不符合我们的需求
2.2集合对象:
List<User> list = Arrays.asList(
new User("就", 25),
new User("bbbbbb", 25),
new User("啊dd", 25),
new User("aaaa", 25),
new User("a试试", 25),
new User("a试试", 24),
new User("啊aaz", 25)
);
Collections.sort(list, (l1, l2) -> {
Collator instance = Collator.getInstance(Locale.CHINA);
return instance.compare(l1.name, l2.name);
});
for (User user : list) {
System.out.println(user);
}
输出:
user{name=aaaa, age=25}
user{name=a试试, age=25}
user{name=a试试, age=24}
user{name=bbbbbb, age=25}
user{name=啊aaz, age=25}
user{name=啊dd, age=25}
user{name=就, age=25}
在输出的结果中可以看到 bbbbbb 排到了啊aaz前面,这个明显不符合我们的预期
3.实现混合排序
具体代码
public class Test {
@RequiresApi(api = Build.VERSION_CODES.N)
public static void main(String[] args) {
class User {
String name;
int age;
public User (String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User {" +
"name='" + name +
", age=" + age +
'}';
}
List<User > list = Arrays.asList(
new User ("就", 25),
new User ("bbbbbb", 25),
new User ("啊dd", 25),
new User ("aaaa", 25),
new User("1", 25),
new User("2", 25),
new User ("a试试", 25),
new User ("a试试", 24),
new User ("啊aaz", 25)
);
Collections.sort(list, (u1, u2) -> {
int result = ToPinyin(u1.name).compareTo(ToPinyin(u2.name));
if (result==0)
{
return u1.age-u2.age;
}
return result;
});
for (User user : list) {
System.out.println(user);
}
}
}
/**
* 汉字转为拼音
* @param chinese
* @return
*/
public static String ToPinyin(String chinese) {
return ToPinyin(chinese,"");
}
/**
* 汉字转为拼音
* @param chinese
* @param separator 分隔符
* @return
*/
public static String ToPinyin(String chinese,String separator) {
String pinyinStr = "";
char[] newChar = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);//小写
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < newChar.length; i++) {
if (newChar[i] > 128) {
try {
pinyinStr += PinyinHelper.toHanyuPinyinStringArray(newChar[i],defaultFormat)[0]+separator;
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pinyinStr += newChar[i] +separator;
}
}
return pinyinStr.substring(0,pinyinStr.length()-1);
}
}
输出:
user{name=1, age=25}
user{name=2, age=25}
user{name='aaaa, age=25}
user{name='啊aaz, age=25}
user{name='啊dd, age=25}
user{name='a试试, age=24}
user{name='a试试, age=25}
user{name='bbbbbb, age=25}
user{name='就, age=25}
看到输出的结果按照我们预期想需求排列了
代码使用到了pinyin.jar,有需要的小伙伴可以点击下方链接去下载
pinyin.jar下载地址为:https://download.csdn.net/download/next_D/15839883