java集合某个字段按照中文拼音排序
List 中的ArrayList本身是按照添加顺序排列的,但是有时候想自定义排序方式怎么办呢?
1. List中的Record 实现 Comparable接口并复写compareto方法
public class Record implements Comparable<Record> {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(Record o) {
return name.compareTo(o.name);
}
}
然后调用sort进行排序
Collections.sort(list);
2.通过内部类实现排序
package com.datayes.ecoinfo;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("你");
list.add("好");
list.add("啊");
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
//获取中文环境
Comparator<Object> com = Collator.getInstance(java.util.Locale.CHINA);
//当返回0或者-1的时候排序方式是 o1,o2 -1继续比较 0不在比较 相等
//当返回1的时候排序方式是 o2,o1
return com.compare(o1, o2);
}
});
for (String temp : list) {
System.out.println(temp);
}
}
}
jdk自带的Collator包涵的汉字太少了,对一些生僻的姓氏不能进行排序。推荐使用:
import com.ibm.icu.text.Collator;
<dependency>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
<version>57.1</version>
</dependency>
//自己测试的 好用
List<A> list1 = new ArrayList<A>();
A a = new A();
a.setName("滴滴");
A b = new A();
b.setName("大哥哥");
A c = new A();
c.setName("李莲英");
A d = new A();
d.setName("杨坤");
A e = new A();
e.setName("李连杰");
A f = new A();
f.setName("成员");
A g = new A();
g.setName("赵润发");
A h = new A();
h.setName("欧阳娜娜");
list1.add(a);
list1.add(b);
list1.add(c);
list1.add(d);
list1.add(e);
list1.add(f);
list1.add(g);
list1.add(h);
//开始自定义比较器
Collections.sort(list1, new Comparator<A>() {
@Override
public int compare(A o1, A o2) {
// 重要部分
Comparator<Object> com = Collator.getInstance(java.util.Locale.CHINA);
return com.compare(o1.getName(), o2.getName());
}
});
for (int i = 0; i < list1.size(); i++) {
System.out.println(list1.get(i).getName());
}
默认
//排序(升序)
Collections.sort(data,new DhBusoperatrecordDTO());
//进行反转 降序
Collections.reverse(data);