CollectuionsSortDemo3解决侵入性

可以用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]]
    }
}

 

posted @ 2016-04-30 14:58  安仔80  阅读(421)  评论(0编辑  收藏  举报