Comparable接口:
如果想要对某个集合元素之间实现比较,非自定义类可以通过工具类Collections中的sort()方法来实现自然排序(从小到大),自定义类必须通过实现Comparable<>接口且必须重写方法int compareTo(T t)自定义排序规则来实现排序,之后再调用Collections中的sort方法(sort()方法底层是元素调用compareTo(E e)方法与另外一个元素比较)来对几何元素实现排序。
升序规则(参照例二解释):
当前对象大于参数对象,返回大于0的数;当前对象小于参数对象,返回小于10的数;当前对象等于参数对象,返回0;return this-o
降序规则(参照例二解释):
参数对象大于当前对象,返回大于0的数;参数对象小于当前对象,返回小于0的数;当前对象等于参数对象,返回0;return o-this
例一:
package com.hyxy.collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestComparable {
public static void main(String[] args) {
List<Character> l=new ArrayList<Character>();
for(int i=0;i<10;i++) {
int num=(int)(Math.random()*26);
l.add((char)(num+65));
}
System.out.println(l);//输出结果:[K, S, F, E, Q, N, P, W, S, J]
Collections.sort(l);
System.out.println(l);//输出结果:[E, F, J, K, N, P, Q, S, S, W]
}
}
例二:
//一自定义类Point
package com.hyxy.collection;
public class Point implements Comparable<Point>{
private int x;
private int y;
public Point() {}
public Point(int x, int y) {
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+")";
}
public int compareTo(Point o) {
return this.y-o.y; //按纵坐标升序排序
}
//测试Point类
package com.hyxy.collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class TestPoint {
public static void main(String[] args) {
Point p0=new Point(1,3);
Point p1=new Point(1,1);
Point p2=new Point(1,4);
Point p3=new Point(1,0);
Point p4=new Point(1,2);
List<Point> list=new ArrayList<Point>();
list.add(p0);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
System.out.println(list);
//输出结果:[(1,3), (1,1), (1,4), (1,0), (1,2)]
Collections.sort(list);
System.out.println(list);
//输出结果:[(1,0), (1,1), (1,2), (1,3), (1,4)]
}
}
若在非自定义类(自定义类也可)中想要实现除了在自定义类中已经定义的CompareTo方法自定义排序,我们可以在使用该比较的类中写一个内部类其中重载一个sort方法,sort(List list,Comparator c),当调用此方法时,在运行时系统调用的比较方法将不再是自定义类中的ComepareTo方法,而是调用Comparator中的compare(E e,E e)方法去进行比较。
例三(Point类为例二中自定义Point类):
package com.hyxy.collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class TestPoint {
public static void main(String[] args) {
Point p0=new Point(1,3);
Point p1=new Point(1,1);
Point p2=new Point(1,4);
Point p3=new Point(1,0);
Point p4=new Point(1,2);
List<Point> list=new ArrayList<Point>();
list.add(p0);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
System.out.println(list);//输出结果:[(1,3), (1,1), (1,4), (1,0), (1,2)]
Collections.sort(list);
MyComparator c=new TestPoint().new MyComparator();
Collections.sort(list,c);
System.out.println(list);//输出结果:[(1,0), (1,1), (1,2), (1,3), (1,4)]
}
public class MyComparator implements Comparator<Point>{
public int compare(Point o1, Point o2) {
return o1.getY()-o2.getY();
}
}
}
可以将例三中的MyComparator类更简化一点,可以写成匿名内部类,可以使代码看起来更加简洁。
package com.hyxy.collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class TestPoint {
public static void main(String[] args) {
Point p0=new Point(1,3);
Point p1=new Point(1,1);
Point p2=new Point(1,4);
Point p3=new Point(1,0);
Point p4=new Point(1,2);
Point[] po=new Point[5];
List<Point> list=new ArrayList<Point>();
for(int i=0;i<5;i++) {
list.add(po[i]);
}
System.out.println(list);//[(1,3), (1,1), (1,4), (1,0), (1,2)]
Collections.sort(list,new Comparator<Point>(){
public int compare(Point o1, Point o2) {
return o1.getY()-o2.getY();
}
});
System.out.println(list);//[(1,0), (1,1), (1,2), (1,3), (1,4)]
}
}
练习:要求定义一个Circle类,实现按照圆半径从小到大排序,在测试类中,要求可以按照圆心距原点距离从小到大排序
自定义Circle类:
package com.hyxy.collection;
public class Circle implements Comparable<Circle>{
private double r;
private int x;
private int y;
public Circle() {}
public Circle(double r, int x, int y) {
this.r = r;
this.x = x;
this.y = y;
}
public double getR() {
return r;
}
public void setR(double r) {
this.r = r;
}
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 "["+r+","+"("+x+","+y+")"+"]";
}
public int compareTo(Circle o) {
return (int)(this.r-o.r);
}
}
测试类:
package com.hyxy.collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class TestCircle {
public static void main(String[] args) {
Circle c1=new Circle(3,2,2);
Circle c2=new Circle(6,1,1);
Circle c3=new Circle(2,3,3);
List<Circle> li=new ArrayList<Circle>();
li.add(c1);
li.add(c2);
li.add(c3);
System.out.println(li);//输出结果:[[3.0,(2,2)], [6.0,(1,1)], [2.0,(3,3)]]
Collections.sort(li);
System.out.println(li);//输出结果:[[2.0,(3,3)], [3.0,(2,2)], [6.0,(1,1)]]
Circle c4=new Circle(5,2,1);
li.add(c4);
System.out.println(li);//输出结果:[[2.0,(3,3)], [3.0,(2,2)], [6.0,(1,1)], [5.0,(2,1)]]
Collections.sort(li, new Comparator<Circle>() {
public int compare(Circle o1, Circle o2) {
return (int)Math.sqrt((o1.getX()*o1.getX()+o1.getY()*o1.getY()))-
(int)Math.sqrt((o2.getX()*o2.getX()+o2.getY()*o2.getY()));
}
});
System.out.println(li);//输出结果:[[6.0,(1,1)], [3.0,(2,2)], [5.0,(2,1)], [2.0,(3,3)]]
}
}