zoukankan      html  css  js  c++  java
  • JAVA-初步认识-常用对象API(集合框架-treeset集合-Comparator比较器)9

    一.

    刚才说完treeset集合的第一种比较方式后,再说一说另外一种方式。

    现在想按照人的姓名排序,如果姓名相同再按年龄排。有人说将上节中的程序稍微修改一下,这是可以的。

    最终的输出结果就是按照年龄的字母顺序来的。

    如果有人说要按照年龄排,那再改回来,这就没劲了。

    在描述person的时候,需要让person具备比较性,只要让person实现comparable接口就可以了,并覆盖compareto方法,定义person这个对象的比较方法。

    而这个比较方法,我们称之为对象的自然排序。换句话说,用的是person类里面默认的比较方法。

    如果不想按照默认排序排呢?不能跑到源代码中修改代码,因为这个person类很有可能不是我们写的,这时该怎么办?

    对象不具备自然顺序就是说,这个对象不是我们定义的。

    上面截图的意思是对象要么不具备比较性,要么比较性就不是我们需要的。这个时候怎么办?这时需要第二种方式。

    不太好理解,不是说treeset能排序么?treeset可以对元素进行排序,可是它不能完成直接对元素的比较。它是在根据元素的比较结果,在确定元素的位置。

    我可以排,但是由元素的比较功能说了算。大还是小,看它的返回值定的。如果元素不具备比较性,就要让集合具备了。也就是你把元素给我,我给你排,或者我来帮你进行比较。按照我的方式进行比较,而不是元素的方式。

    如果集合一初始化完毕后,我们把元素添加完了,我们再具备比较性就晚了。

    这个对象什么时候比的?是在添加的时候比的。添加一个没事,添加第二个就出事了。因为添加第二个就立刻开始比较了,因为要确定这个元素在容器中的位置到底是大还是小。所以在添加之前,容器具备比较性。这个比较性是在集合创建对象时完成的。

    创建集合对象时要找点东西应该找谁?构造函数。创建对象要做的事情,就是构造。

    java的utill包里面的treeset类,查阅它的构造函数

     第三个构造函数就是讲述建立一个比较器。这个比较器它是个接口。具体怎么排,它不知道,

    comparator接口的两个方法,一个时compareT方法,一个时equals方法。先不说equals方法,

    集合自身具备比较性,传递两个才能比,元素自身具备比较性,传递一个就能比。

    接下来就要做比较器的动作,我准备在集合对象创建时,建立一个比较器。新建一个比较器compator的类,

    o1和o2就是person,集合里面装的全是person,大家比较也是person。容器就在调用compare方法,把传递的对象两个两个进行比较。

    首先要做强转,因为要用对象特有方法。

    这里再写name就白扯了,因为name是私有的。(就是将比较挪了地方)

    上面就是创建了一个根据person类的name进行排序的比较器。

    之前例子中的五个自定义对象,是根据person类中本身具备的自然顺序,可是这里面改了,

    添加了new comparator后,原先例子中的按年龄输出的结果就变为了按姓名的字母输出了。

    比较器的出现,和person具备的自然排序,输出时以比较器为主(使用时比较器更为常用)。通常对象存储到集合中,通常除了equals和hashcode方法,以及toString以外,一般还会实现这个接口。          

    Java中的很多类都实现这个接口,比如说String,String这类事物产生很多对象,所以它应该具备着排序比较性。还有integer,数字变对象也能排序,一样要进行比较。凡是类能产生n多对象的,通常都会实现这个接口,让其具备比较性。

    implements comparable是对象的默认排列方式,如果想指定的话,最好使用比较器来完成。

                          

  • 相关阅读:
    HDU-3081 Marriage Match II (最大流,二分答案,并查集)
    HDU-3605 Escape(最大流,状态压缩)
    HDU-3338 Kakuro Extension(最大流,方格横纵和问题)
    HDU-2732 Leapin' Lizards
    UVA-10480 Sabotage(最小割,割边方案)
    ajaxfileupload.js无刷新异步上传图片截取头像Demo
    未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService...与visualsvn initialization failed
    Python-数据库连表查询、子查询
    Python学习之数据库
    Python学习之表的数据类型
  • 原文地址:https://www.cnblogs.com/wsw-bk/p/8315515.html
Copyright © 2011-2022 走看看