可以用Collections工具类的sort排序的一个重载方法 解决侵入性问题
/** * 经过Demo2的实验,我们知道为了实现一个别人的方法 * 而在自己本类中加入额外太多的代码,并不好.侵入性太强. * 那么怎么解决呢? * 同样还是排序Point类,我们为了不让Point类中加入过多的 * 额外不需要的代码. * 关键点: * 可以用Collections工具类的sort排序的一个重载方法. void sort(List<T> list,Comparator<? super T> c) 参数: list - 要排序的列表。 c - 确定列表顺序的比较器。 Api: 根据指定比较器产生的顺序对指定列表进行排序 */ public class CollectuionsSortDemo3 { public static void main(String[] args) { //1.建立集合,并添加Point类型元素 List<Point> list = new ArrayList<Point>(); list.add(new Point(5,5)); list.add(new Point(11,2)); list.add(new Point(3,8)); list.add(new Point(6,3)); //2.输出排序前结果 System.out.println(list); // [Point [x=5, y=5], Point [x=11, y=2], Point [x=3, y=8], Point [x=6, y=3]] //关键 3.我们需要建立一个比较器,这个比较器Comparator<T> /* * 强行对某个对象 collection 进行整体排序 的比较方法。 * 可以将 Comparator 传递给 sort 方法. * 思路:我们可以建立一个类,叫比较器的类,来实现Comparator<T>接口 * ,然后实现这个接口下的compare方法. * compare方法: * int compare(T o1, T o2) * 返回值同样是int型, 正数,负数,0. * 返回值>0 o1 > o2; * ... * 在下面定义 我的比较器类 ,就可以用Collections.sort的重载方式排序了 */ myComparator myComparator = new myComparator(); //new 一个比较器对象; //void sort(list,比较器) Collections.sort(list,myComparator); //输出排序后结果 System.out.println(list); // [Point [x=6, y=3], Point [x=5, y=5], Point [x=3, y=8], Point [x=11, y=2]] } } //这里用myCompartor 我的比较器,用来定义Point类的比较大小方法.这就有别于写在Point类中 //这样做会减少代码的侵入性! 当然,这个比较器,如果只是进行一次临时的排序,完全可以写成匿名内部类. class myComparator implements Comparator<Point>{ @Override public int compare(Point o1, Point o2) { /* * 坐标点的比大小,比该点到远点的距离,即比两个坐标点 x*x+y*y 的大小 * */ int o1Leng = o1.getX()*o1.getX() + o1.getY()*o1.getY(); int o2Leng = o2.getX()*o2.getX() + o2.getY()*o2.getY(); return o1Leng - o2Leng; } }
可以优化,把比较器写在内部类中
CollectuionsSortDemo4 把demo3中的比较器写成内部类的方法
/** * 经过Demo3,解决侵入性的同时,这次我们考虑,既然是一次应用, * 我们用匿名内部类来代替myComparator类. */ public class CollectuionsSortDemo4 { public static void main(String[] args) { //1.建立集合,并添加Point类型元素 List<Point> list = new ArrayList<Point>(); list.add(new Point(5,5)); list.add(new Point(11,2)); list.add(new Point(3,8)); list.add(new Point(6,3)); //2.输出排序前结果 System.out.println(list); // [Point [x=5, y=5], Point [x=11, y=2], Point [x=3, y=8], Point [x=6, y=3]] //关键 3.我们需要建立一个比较器,这个比较器Comparator<T> /* 因为比较器是临时使用,所以完全可以用匿名内部类代替,写法如下 */ //void sort(list,内部类写的比较器) Collections.sort(list,new Comparator<Point>(){ @Override public int compare(Point o1, Point o2) { int o1Leng = o1.getX()*o1.getX() + o1.getY()*o1.getY(); int o2Leng = o2.getX()*o2.getX() + o2.getY()*o2.getY(); return o1Leng - o2Leng; } }); //输出排序后结果 System.out.println(list); // [Point [x=6, y=3], Point [x=5, y=5], Point [x=3, y=8], Point [x=11, y=2]] } }
时间: 2024-09-27 06:04:59