java中可以通过Collectioins的sort方法对List进行排序,首先看API中的两种重载的方法:
public static <T extends Comparable<? super T>> void sort(List<T> list)
说明:根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。此外,列表中的所有元素都必须是可相互比较的(也就是说,对于列表中的任何 e1 和 e2 元素,e1.compareTo(e2) 不得抛出 ClassCastException)。此排序方法具有稳定性:不会因调用 sort 方法而对相等的元素进行重新排序。指定列表必须是可修改的,但不必是大小可调整的。
该排序算法是一个经过修改的合并排序算法(其中,如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。此算法提供可保证的 n log(n) 性能。 此实现将指定列表转储到一个数组中,并对数组进行排序,在重置数组中相应位置处每个元素的列表上进行迭代。这避免了由于试图原地对链接列表进行排序而产生的 n2 log(n) 性能。参数:
list - 要排序的列表。
抛出:
ClassCastException - 如果列表包含不可相互比较 的元素(例如,字符串和整数)。
UnsupportedOperationException - 如果指定列表的列表迭代器不支持 set 操作。public static <T> void sort(List<T> list,
Comparator<? super T> c)
参数:
list - 要排序的列表。
c - 确定列表顺序的比较器。null 值指示应该使用元素的自然顺序。
其他同上
用法:
List中所放实体实现Comparable接口;
实现按照age由小到大排序,age相同时安照level排序
package listSortTest;
public class Persion implements Comparable<Persion>{
private String name;
private int age;
public Persion(String name, int age, int level) {
super();
this.name = name;
this.age = age;
this.level = level;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public int getLevel() {
return level;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setLevel(int level) {
this.level = level;
}
private int level;
@Override
public int compareTo(Persion p) {
if(this.age > p.age){
return 1;
}
else if(this.age < p.age){
return -1;
}
else{
//return 0; //age相同时按照level排序
if(this.level > p.level){
return 1;
}
else if(this.level < p.level){
return -1;
}
else {
return 0;
}
}
}
@Override
public String toString() {
return this.name +" "+ this.age +" "+this.level;
}
}
测试类:
package listSortTest;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ListSortTest {
public static void main(String[] args) {
Persion p1 = new Persion("qwe", 20, 5);
Persion p2 = new Persion("asd", 12, 3);
Persion p3 = new Persion("zxc", 22, 2);
Persion p4 = new Persion("qaz",20,1);
List<Persion> ps = new ArrayList<Persion>();
ps.add(p1);
ps.add(p2);
ps.add(p3);
ps.add(p4);
Collections.sort(ps);
for(Persion p : ps){
System.out.println(p);
}
}
}
**传入确定列表顺序的比较器**
package ListSortTest2;
public class Persion{
private String name;
private int age;
public Persion(String name, int age, int level) {
super();
this.name = name;
this.age = age;
this.level = level;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public int getLevel() {
return level;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setLevel(int level) {
this.level = level;
}
private int level;
@Override
public String toString() {
return this.name +" "+ this.age +" "+this.level;
}
}
测试类:
package ListSortTest2;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ListSortTest {
public static void main(String[] args) {
Persion p1 = new Persion("qwe", 20, 5);
Persion p2 = new Persion("asd", 12, 3);
Persion p3 = new Persion("zxc", 22, 2);
Persion p4 = new Persion("qaz",20,1);
List<Persion> ps = new ArrayList<Persion>();
ps.add(p1);
ps.add(p2);
ps.add(p3);
ps.add(p4);
Collections.sort(ps,new Comparator<Persion>() {
@Override
public int compare(Persion o1, Persion o2) {
if(o1.getAge() > o2.getAge()){
return 1;
}
else if(o1.getAge() < o2.getAge()){
return -1;
}
else{
return 0;
}
}
});
for(Persion p : ps){
System.out.println(p);
}
}
}
“`