目录
三、将汉字转拼音,进行排序,可包含拼音和汉字和字母,排序不会混乱
Student--测试用实体类
public class Student {
private String id;
private String name;
private String age;
private String address;
public Student(String id, String name, String age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age='" + age + '\'' +
", address='" + address + '\'' +
'}';
}
}
一、简单中文字符排序,不包含英文和数字,纯string类型
List<String> list = new ArrayList<>();
list.add("河北");
list.add("背景");
list.add("中国");
list.add("阿拉伯");
//设置中文排序
Comparator comparator = Collator.getInstance(Locale.CHINA);
Collections.sort(list ,comparator);
//输出遍历
list.forEach(item->{System.out.println(item);});
输出结果:
阿拉伯
背景
河北
中国
加拼音或字母之后排序会错乱
/*---------------------加拼音或字母或数字排序-------------------------------*/
List<String> list = new ArrayList<>();
list.add("河北");
list.add("a背景");
list.add("b中国");
list.add("阿拉伯");
Comparator comparator = Collator.getInstance(Locale.CHINA);
Collections.sort(list ,comparator);
list.forEach(item->{System.out.println(item);});
输出结果
输出结果:
a背景
b中国
阿拉伯
河北
a背景和阿拉伯都以a开头,但顺序错乱
二、将list<T>进行排序,被排序列不包含拼音及数字
Student stuA = new Student("1", "啊拉伯", "M", "不了");
Student stuB = new Student("2", "啊拉伯", "G", "阿尼");
Student stuC = new Student("3", "背景", "M", "护板");
Student stuD = new Student("4", "中国", "G", "球了");
Student stuE = new Student("5", "四川", "M", "哈登");
List<Student> list = new ArrayList<>();
list.add(stuA);
list.add(stuB);
list.add(stuC);
list.add(stuD);
list.add(stuE);
/*---------------------------JDK1.7 list.sort排序---------------------------------*/
list.sort(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// return o1.getName().compareTo(o2.getName());
return Collator.getInstance(java.util.Locale.CHINA).compare(o1.getName(), o2.getName());
}
});
//会直接将原list排序
list.forEach(item->{System.out.println(item.getName());});
输出结果:
啊拉伯
啊拉伯
背景
四川
中国
使用jdk1.8方法将两列同时排序,先排name,name相同排address,不能包含拼音及数字
/*---------------------------JDK1.8 stream().sorted排序---------------------------------*/
List<Student> newList = list.stream().sorted(
//比较姓名
new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return Collator.getInstance(java.util.Locale.CHINA).compare(o1.getName(), o2.getName());
}
}.thenComparing(new Comparator<Student>() {//比较年龄
@Override
public int compare(Student o1, Student o2) {
return Collator.getInstance(java.util.Locale.CHINA).compare(o1.getAddress(), o2.getAddress());
}
})
).collect(Collectors.toList());
newList.forEach(item->{System.out.println(item.getId()+"------------------"+item.getName()+"---------------"+item.getAddress());});
输出结果:
2------------------啊拉伯---------------阿尼
1------------------啊拉伯---------------不了
3------------------背景---------------护板
5------------------四川---------------哈登
4------------------中国---------------球了
--加拼音及数字顺序会乱
三、将汉字转拼音,进行排序,可包含拼音和汉字和字母,排序不会混乱
需要引入:net.sourceforge.pinyin4j 包,maven仓库没有这个包
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
format.setCaseType(HanyuPinyinCaseType.LOWERCASE);//设置大小写
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);//设置音调
format.setVCharType(HanyuPinyinVCharType.WITH_V);
/*---------------------------JDK1.8 stream().sorted排序---------------------------------*/
List<Student> newList = list.stream().sorted(
//比较姓名
new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return Collator.getInstance(java.util.Locale.CHINA).compare(PinyinHelper.toHanyuPinyinString(o1.getName(),format,""), PinyinHelper.toHanyuPinyinString(o2.getName(),format,""));
}
}.thenComparing(new Comparator<Student>() {//比较地址
@Override
public int compare(Student o1, Student o2) {
int cmp = 1
try(
cmp =Collator.getInstance(java.util.Locale.CHINA).compare(PinyinHelper.toHanyuPinyinString(o1.getAddress(),format,""), PinyinHelper.toHanyuPinyinString(o2.getAddress(),format,""));
)catch(BadHanyuPinyinOutputFormatCombination e1){ e1.printStackTrace();}
return cmp ;
}
})
).collect(Collectors.toList());
newList.forEach(item->{System.out.println(item.getId()+"------------------"+item.getName()+"---------------"+item.getAddress());});