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]]
    }
}
时间: 2024-09-27 06:04:59

CollectuionsSortDemo3解决侵入性的相关文章

硝烟中的Erlang -- Erlang生产系统问题诊断、调试、解决指南

英文原名:Stuff Goes Bad: Erlang In Anger 英文作者:FRED HEBERT 下载地址:http://vdisk.weibo.com/s/iGQ-rFuJU0-4 译者序 在我近20年的软件开发工作中,除了Erlang,还使用过许多其他编程语言.有工作需要的C/C++.Java,也有作为业余爱好使用的Lisp.Haskell.Scala等,其中我最喜欢的当属Erlang.除了因为我的电信软件开发背景外,还有一个很重要的原因是Erlang独特的设计哲学和解决问题方式.

水平分库分表的关键问题及解决思路

在之前的文章中,我介绍了分库分表的几种表现形式和玩法,也重点介绍了垂直分库所带来的问题和解决方法.本篇中,我们将继续聊聊水平分库分表的一些技巧. 分片技术的由来 关系型数据库本身比较容易成为系统性能瓶颈,单机存储容量.连接数.处理能力等都很有限,数据库本身的“有状态性”导致了它并不像Web和应用服务器那么容易扩展.在互联网行业海量数据和高并发访问的考验下,聪明的技术人员提出了分库分表技术(有些地方也称为Sharding.分片).同时,流行的分布式系统中间件(例如MongoDB.ElasticSe

MariaDB Spider蜘蛛侠轻松解决表的横纵向扩展

什么是Spider? 当您的数据库不断增长时,您绝对需要考虑其他技术,如数据库分片.Spider是MariaDB内置的一个可插拔用于MariaDB/MySQL数据库分片的存储引擎,充当应用服务器和远程后端DB之间的代理(中间件),它可以轻松实现MySQL的横向和纵向扩展,突破单台MySQL的限制,支持范围分区.列表分区.哈希分区,支持XA分布式事务,支持跨库join.通过Spider,您可以跨多个数据库后端有效访问数据,让您的应用程序一行代码不改,即可轻松实现分库分表! 分库分表架构图: 应用程

Java使用序列化的私有方法巧妙解决部分属性持久化问题

部分属性持久化问题看似很简单,只要把不需要的持久化的属性加上瞬态关键字(transient关键字)即可,没错,这也是一种解决方案,但在有的时候行不通,例如在一个计税系统和人力系统对接的时候,计税系统需要从人力系统获得人员的姓名和基本工资,作为纳税的一句,而人力系统的工资分成 分成两个部分:基本工资和绩效工资,基本工资没有什么秘密,一般都是直接跟年限挂钩,但是绩效工资一般来说是保密的,不能泄露到外系统,话不多说,上代码 import lombok.AllArgsConstructor; impor

微服务架构 - 解决Docker-Compose服务编排启动顺序问题

基于Docker Compose进行服务编排时,一定碰到服务启动顺序的问题,例如:B服务启动之前,A服务要已经启动并且可以正常对外服务. 这个启动顺序的问题,Docker Compose本身它是无法解决的,即使定义了depends_on或者links,它只能保证该服务依赖这些服务,启动本服务时会将依赖的服务也启动,但是启动顺序无法得到保证. 目前本人实验比较好的方案有两种: 基于wait-for-it.sh实现,前提条件是本镜像要支持bash 对于自己构建的镜像时,让工程本身带一个监听类,用于监

Mysql大数据量问题与解决

今日格言:了解了为什么,问题就解决了一半. Mysql 单表适合的最大数据量是多少? 我们说 Mysql 单表适合存储的最大数据量,自然不是说能够存储的最大数据量,如果是说能够存储的最大量,那么,如果你使用自增 ID,最大就可以存储 2^32 或 2^64 条记录了,这是按自增 ID 的数据类型 int 或 bigint 来计算的:如果你不使用自增 id,且没有 id 最大值的限制,如使用足够长度的随机字符串,那么能够限制单表最大数据量的就只剩磁盘空间了.显然我们不是在讨论这个问题. 影响 My

Charles关于Https SSLHandshake解决备忘录

抓包Https时错误提示:SSLHandshake: Received fatal alert: unknown_ca 1.准备工作,下载Charles版本 有情链接,提取码为:ghc6,其中包含了Charles两个版本 a Charles3.9.3 主要针对iphone5手机抓包 b Charles4.1.2 主要针对iphone6及以上抓包 为什么用两个不同版本?实践中发现,某一个版本不能同时解决问题 2.设置允许SSL Proxy Proxy->Proxy Settings->SSL-&

.Net使用163smtp发送邮件时错误:邮箱不可用. has no permission解决方法

C#实现简单邮件发送代码如下 public static void SendAsync(string emailTo, string subject, string mailBody) { var msg = new MailMessage(); msg.To.Add(emailTo); // msg.From = new MailAddress(_userNameForEmail, "显示的发件人名称", System.Text.Encoding.UTF8); msg.Subject

Java TM 已被阻止,因为它已过时需要更新的解决方法

公司的堡垒机需要通过浏览器登陆,且该堡垒机的网站需要Java的支持,最近通过浏览器登陆之后总是提示"java TM 已被阻止,因为它已过时需要更新的解决方法"导致登陆之后不能操作, 但是操作系统中确实已经安装了比较新的JDK,安装的JDK版本是jdk-7u67-windows-i586,因为太烦人,所以决定搞清楚报错的原因,一劳永逸,彻底解决这个问题 准备工作:安装JDK,安装版本jdk-7u67-windows-i586.exe,因为机器的Eclipse还依赖64位的JDK,所以另安