有一个Cell类,代码如下:
public class Cell implements Comparable<Cell>{
public int x;
public int y;
public Cell(int x,int y){
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "(" + x + "," + y + ")";
}
@Override
public boolean equals(Object obj) {
if(obj == null){
return false;
}
if(obj == this){
return true;
}
if(obj instanceof Cell){
Cell c = (Cell)obj;
return this.x ==c.x && this.y == c.y;
}
return true;
}
/**
* 比较大小的方法
* 返回值不关注具体的值,只关注取值范围
* 返回值<0 : 当前对象比给定对象小
* 返回值=0 : 两个对象相等
* 返回值>0 : 当前对象比给定对象大
*/
@Override
public int compareTo(Cell o) {
/**
* 比较规则:y值大的就大
*/
return this.y - o.y;
}
}
有一个集合类,代码如下:
public class SortCollection3 {
public static void main(String[] args) {
List<Cell> list = new ArrayList<Cell>();
list.add(new Cell(4,5));
list.add(new Cell(1,7));
list.add(new Cell(1,2));
list.add(new Cell(3,3));
System.out.println(list);
//如要以y的小和进行排序(若元素所在类中没有实现Compareable接口,则要先在元素所在类中实现
Compareable接口,并重写compareTo方法,自定义比较规则,见上面的Cell类)
Collections.sort(list);
System.out.println(list);
//如要以x+y的和进行排序 则需要新建比较器(因为元素中已经实现了Comparable类,并重写了compareTo方法,就必须定义一个新的比较器的实现类)
Comparator<Cell> cc =new MyComparator();
Collections.sort(list,cc);
System.out.println(list);
}
}
新的比较器实现类代码如下:
class MyComparator implements Comparator<Cell>{
//重新定义新的规则
@Override
public int compare(Cell o1, Cell o2) {
return (o1.x + o1.y) - (o2.x + o2.y);
}
测试结果如下:
[(4,5), (1,7), (1,2), (3,3)]
[(1,2), (3,3), (4,5), (1,7)]
[(1,2), (3,3), (1,7), (4,5)]
以上比较如果只使用一次的话,也可以通过匿名内部类来实现
代码如下:
public class TestBook3 {
public static void main(String[] args) {
List<Cell> list = new ArrayList<Cell>();
list.add(new Cell(2,3));
list.add(new Cell(5,1));
list.add(new Cell(3,2));
System.out.println(list);
Collections.sort(list,new Comparator<Cell>(){//匿名内部类
@Override
public int compare(Cell o1, Cell o2) {//按照y值的升序排列
return o1.y - o2.y;
}
});
System.out.println(list);
}
}
测试结果如下:
[(2,3), (5,1), (3,2)]
[(5,1), (3,2), (2,3)]