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是对象的默认排列方式,如果想指定的话,最好使用比较器来完成。

 

 

 

 

 

 

 

 

 

 

                      

 

posted @ 2018-01-19 14:35  前锋营  阅读(135)  评论(0编辑  收藏  举报