排序集合元素
排序集合使用的是集合的工具类Collection的静态方法sort。
排序仅能对List集合进行。因为Set部分实现类是无序的。
Collections.sort(list)
排序自定义类型元素的集合
eg:
/**
* 该类用于作为集合的元素
*/
public class Point implements Comparable<Point> {
private int x;
private int y;
public Point(int x, int y) {
super();
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public String toString() {
return "("+x+","+y+")";
}
/*
*当实现了Comparable接口后,需要重写下面的方法
*该方法的作用是定义当前对象与给定参数对象比较大小的规则。
*返回值为一个int值,该值表示大小关系。它不关注具体的取值是多少,而关注的是取值范围。
*当返回值>0时:当前对象比参数对象大
*当返回值<0时:当前对象比参数对象小
*当返回值=0时:两个对象相等。
*/
public int compareTo(Point o) {
/*
* 比较规则,点到原点的距离长的大
*/
int len = this.x*this.x+this.y*this.y;
int olen = o.x*o.x+o.y*o.y;
return len-olen;
}
}
public static void main(String[] args) {
List<Point>list = new ArrayList<Point>();
list.add(new Point(4,2));
list.add(new Point(2,3));
list.add(new Point(1,4));
list.add(new Point(6,7));
list.add(new Point(9,3));
list.add(new Point(8,1));
System.out.println(list);
/*
* sort方法要求集合元素必须实现Comparable接口,
* 该接口用于规定实现类是可以比较的。
* 其中一个抽象方法是用来定义比较大小的规则。
*
* 我们想使用sort方法排序集合,但是该方法要求
* 我们的集合元素必须实现Comparable接口并且定义比较规则,
* 这种我们想要使用某个功能,而它要求我们修改程序的现象称为"入侵性"。
* 修改的代码越多,侵入性越强,越不利于程序的扩展。
*/
Collections.sort(list);
System.out.println(list);
}
定义一个额外的比较器
eg:
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("jerry");
list.add("tom");
list.add("merry");
list.add("rose");
list.add("jack");
list.add("Bilibili");
list.add("lady gaga");
list.add("kobe");
list.add("JACKSON");
list.add("Karray");
list.add("Roy");
list.add("JAMES");
System.out.println(list);
MyComparator com = new MyComparator();
/*
* 重载的sort方法要求传入一个额外的比较器
* 该方法不再要求集合元素必须实现Comparable接口,
* 并且也不再使用集合元素自身的比较规则排序了,
* 而是根据给定的这个额外的比较器的比较规则对集合元素进行排序。
* 实际开发中也推荐使用这种方式排序集合元素,若集合元素是自定义的。
* 创建比较器时也推荐使用匿名内部类的形式。
*/
Collections.sort(list,com);
System.out.println(list);
//匿名内部类形式创建
Comparator<String> com1 = new Comparator<String>() {
public int compare(String o1,String o2) {
return o2.length()-o1.length();
}
};
Collections.sort(list, com1);
System.out.println(list);
}
/**
* 定义一个额外的比较器
*/
class MyComparator implements Comparator<String>{
/*
* 该方法用来定义o1和o2的比较
* 若返回值>0:o1>o2
* 若返回值<0:o1<o2
* 若返回值=0:两个对象相等
*/
public int compare(String o1, String o2) {
/*
* 字符串中字符多的大
*/
return o1.length()-o2.length();
}
}