Collections.sort静态方法
Comparable接口
public static <T> void sort(List<T> list) :将集合中元素按照默认规则排序。
注意传递的是List类而非Set
代码举例:
package comp;
import java.util.ArrayList;
import java.util.Collections;
public class TestSort {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String> ();
list.add("abc");
list.add("abcd");
list.add("cde");
Collections.sort(list); //默认排序[abc, abcd, cde]
System.out.println(list);
}
}
下面我新建个学生类,为了使这个学生类能使用Conections.sort()
进行排序,需要这个学生类实现Comparable
接口,并重写comparaTo()
方法来指定排序规则
自己 (this) - 参数 :升序
package comp;
public class Student implements Comparable<Student> {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Student o) {
// TODO Auto-generated method stub
return this.age-o.age; //升序
}
测试代码
import java.util.ArrayList;
import java.util.Collections;
public class TestSort {
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<Student> ();
list.add(new Student("伍六七",17));
list.add(new Student("鸡大宝",42));
list.add(new Student("梅花十三",19));
Collections.sort(list); //默认排序[abc, abcd, cde]
System.out.println(list);
}
}
Comparator接口
public static <T> void sort(List<T> list,Comparator<? super T> ) :将集合中元素按照指定规则排序。
使用该方法时,需要传递Comparator
接口的匿名内部类,并重写compare
方法
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Test02Sort {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String> ();
list.add("abc");
list.add("abcd");
list.add("cde");
//自定义排序方法:长度降序,字典降序
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1,String o2) {
// return o2.length()!=o1.length()? o2.length()-o1.length():o2.charAt(0)-o1.charAt(0);
return o2.length()!=o1.length()? o2.length()-o1.length():o2.compareTo(o1);
}
});
System.out.println(list); // [abcd, cde, abc]
}
}
总结
使用Comparator
比较灵活,而Comparable
需要比较类去实现该接口。
**Comparable:**强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法
被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现
此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中
的键或有序集合中的元素,无需指定比较器。
**Comparator:**强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或
Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或
有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。