00:00
那好了,同学们,咱们继续再往下看啊,那么除了这种方式,还有没有别的方式大家看。一种方式是让它转成comparable吧,哎,你有没有看上面还有个if语句,这个if语句是说cpir不等于空的情况下会走这个。L会走它,诶你看其实还有另外一种方式是说上来是打拿了一个比较器,比较器如果不等于空,你看这是不是比较器啊,不等于空,是不是走这个走这个分支,这个else分支是就不走了。所以说要想排序不只是有一种方法,你还可以让这个比较器不等于空。这个比较器不等于空,怎么能做呢?你往上看,这个类当中是不是它确实有个比较器,这个比较器是不是通过构造方法可以给它传,如果你调无参构造,是不是比较器是空的?如果你调有参数的构造方法,是不是比较器就不为空?对吧,所以大家看啊,还可以单独编写比较器的方式来给大家演示一下另外一种情况啊。来,我们去新建一个这个class呢,我们就叫做tree set times,零六,各位啊,零六非常经典的一个一个数据结构,各位啊,来,其他的我就先给它关掉了。
01:12
然后接下来呢,我在这个位置呢,我干什么呢?就是说哎呃,TS集合中元素可排序的第二种方式。使用什么呀,比较器的方式啊,使用比较器的方式什么意思呢?比如在这里呢,我再来一个class,我这个叫做animal动物啊,还有。这个类有了是吧。或者说我叫。嗯。叫啥呢?乌龟吧,行吧,乌龟啊,诶,这是一个乌龟。啊,乌龟,乌龟呢,有一个年龄千年王八万年龟啊,那么这块呢,我们写一个构造方法,这个构造方法呢,有一个参数age。
02:09
这里呢,我们再写上比如说this.age age就行了,然后接下来呢?我们在这块呢,实现一个什么呀,叫做toth string方法,这个to string方法的话,我们就直接写一下就行了啊来我们叫做乌龟啊,乌龟来中括号吧,改一下乌龟啊。小乌龟啊,来我们这块呢,继续往下啊,大家看这一块呢,我们加一个什么S,实现comparable这个接口,这是我们的第一种方式。是不是,哎,我说了,除了这种方式,还有别的方式啊,还有别的方式。那别的方式是什么?是比较的一种方式,各位啊,好,我们在这里单独编写一个比较器,在比较器中提供比较规则,各位啊,这是属性,这是构造方法。
03:07
嗯,行吧,那单独啊,看好了,单独在这里编写一个比较器。比较器实现什么呀?Java u下的compar compar接口啊,注意注意啊,这个comparable compar明白吧,所以这一块呢,我们写一个class,这个class我们假如说就叫做乌龟的比较器,那这样的话应该是乌龟。Comparor employment去实现什么呀?Comparor这个接口,这个接口当中啊,也可以跟上泛型,各位啊,我们直接拿过来比较的是乌龟就行了,好了,此时呢,我们需要实现这个接口当中的方法叫compare方法。Compare啊,这个方法叫compare,乌龟一和乌龟二你看。
04:01
对吧?哎,我们这里可以指定比较规则,各位啊,指定比较规则对吧?按照年龄排序,那么这个时候应该是O一点HO1是一个乌龟减去o2.h不就行了吗?对吧?好,这个比较规则就写完了,各位,这是个比较器,你看。对吧,那这个时候你在创建这个吹塞集合,在创建吹塞集合的时候啊,需要使用这个比较器,明白吗。你不能说你这啊,叭叭叭叭一顿写对吧,哎,写完之后你不。不给他传比较器,那肯定不行。来,走一个。那这个呢,我们就叫做什么呀,叫做乌龟s new一个什么呀,Tree set,注意new tree set,你这么做肯定就不行了。这样不行啊,这样不行,这样是没有比较器啊,这样不行啊,没有通过构造方法传递一个比较器进去。
05:08
你需要怎么办呢?你需要在创建这个set集合的时候,你给他传一个比较器,比较器就是它。你看。你用一个比较器对象传进去明白吧,这个构造方法跟的就是它呀。它有无参的构造方法,也有有参数的构造方法。对吧,你new一个set,你就new一个map里边传一个什么呀,Competitor这样的话是不是比较器就付给了我们这个比较器的这个属性,将来我们这个put方法。来往下走啊,将来这个铺的方法,哎呀,在哪呢。将来这个铺的方法这一块是不是就不是空了,它付给了这个变量,这个变量就不等于空啊,它不等于空的话就会走比较器,就不会走这个else分支了,明白吧?哎,所以这块呢,大家要注意啊,它的实现细节是在传递一个比较器啊,需要传递一个比较器啊,给构造方法传递一个比较器,那么这个时候呢,我们有了这个比较器之后呢,接下来我再往这个乌龟S里边添加东西一个乌龟。
06:19
1000啊,然后乌龟s.I的,然后另一个乌龟,然后这个乌龟呢,比方说是800。然后呢,这个乌龟s.I的,然后再加一个,你一个乌龟行吧,然后加一个,比如说810。然后接下来我们for循环进行,电力乌龟乌龟乌龟S,每循环一次输出这个乌龟来走直行。我们看一下,看一下它的结果啊,有没有排序。是不是按照年龄进行排序啊?对吧,这种方式也可以各位。听懂了吧,哎,这叫比较气的一种方式,比较器的一种方式啊,这种方式实际上它的实线差不多也是这样的,比较器不等于空的话,大家看调的方法是不是compare方法,而且compare方法是不是比较器的方法,如果你是compareable的话,大家看是不是调的compare to方法呀,最终总是这个呢,返回一什么呀,返回一个这个int类型数字,这个呢,同样也是返回一个int类型数字嘛,这个数字有可能小于零,有可能是大于零,也有可能是等于零的,大于小于零往左子数上走,大于零往右子数上走,如果相等的话,Value就覆盖。
07:30
就覆盖啊,这是我们的一个自平衡二大。那采用比较器的方式好。各位。那我问大家一个问题啊,比较我们可以吗?我们可以用匿名内部类的方式吗?大家。可以使用匿名内部类的方式。
08:05
还记不记得我们接口可以。这不是一个接口吗,这个。是吧,你不愿意写这个类行不行?可以吗?可以,你不写这个类,是不是也可以直接扭接口?对吧,这一块这个乌龟compor就没有,那你可以new一个competitor new这个competor的时候,哎,这边我们加一个什么呀,泛形各位啊叫乌龟,然后加一个大括号表示方,表示实线呀,对吧?哎,表示实线啊,那么接下来我们就可以。这个类没有名字吗?来再仔细看一下啊,我们是不是可以直接一个competor。对不对啊,这个comp是匿名类部类呀,这个类没有名字呀,但是你这个类也需要去实现什么。这个方法,然后你在这怎么办,O一点什么呀,H减去什么呀,O2点什么H就行了,那你看看这种方式是不是也可以看运行。
09:06
匿名内部类的方式,你看。是吧,也没问题吧,这样的话,这个类是不是就不用写了,这个比较器你就不用写了。但你的比较得得过来啊,匿名内部类的方式没有。这个类没有名字。直接六接口六接口六接口后边一定要加大括号啊,这个大括号里边就是对它的实现。就这这块吗?对吧,你有一个comp。直接idea会生成啊,你就不用管了,然后这块O一点什么呀,Age,然后减去o2.age就行了,匿名内部类的方式啊,找一个啊。一样的啊,一样的这种方式也要了解一下啊,了解一下。好了,总之呢,我们在这里最主要给大家讲了,讲了什么呢?就是我们放到tree set集合。最终的结论,各位啊,最终的结论放到什么呀,这个吹site或者叫吹map集合K部分的元素。
10:13
要想做到什么呀,排序。哎。包括两种方式,各位啊,包括两种方式,第一种。放在集合中的元素实现什么java.language comparable接口啊,第二种是在在构造吹塞或者吹map集合的时候,给他传一个比较器对象,这两种方式都行。那么现在大家思考一下,我们。我们用用什么乌龟好逗什么?
11:04
来咱们继续啊,就是刚才这两种方式你怎么选,这两种方式你是怎么选择的。就是以后我采用。实现compar接口呢,还是我单独编写一个比较器呢,你说?大家有没有什么这个想法可以聊一聊的?就这两种方式怎么选择?Comparable和compar怎么选择呢?啊不,我说的不是这个,不是这个匿名,不是匿名内类的事儿啊,不是匿名内部类的事儿。对,不是说匿名累不累,我是说。你comparable和compar这两个怎么选?
12:00
哪个比较高级,选哪个,我说一下各位是这样的啊,如果比较规则是一成不变的。就是你比较规则不会不会轻易再改变。一般用哪个?如果你的比较规则经常变化的话。我们能不能写多个比较器,这个比较器里边一个规则,然后再去写一个比较器。第三个,第四个,我写好几个比较器,然后我在构造方法里边,我传这个比较器的时候,我可以随便传,我传这个比较器就是按照这个规则,我传另外一个比较器,就是按照另外一个规则,我传第三个比较器,我就是按第三个规则去走。就是大家理解不解,一个一个一个一个区别。就是我想告诉大家的是,如果说你看啊,为什么string这个类它。为什么是这个类它。Compare to方法写写完了。为什么?
13:00
我们的这个类。它也实现了comparable接口,为什么和都实现了comparable,因为字符串的比较之间在进行比较的时候,以及数字之间在进行比较的时候,它比较规则是不是固定的。对吧,所以说这块要注意啊。当比较规则不会发生改变的时候。或者说,当比较规则只有一个的时候。建议实现什么?Comparable接口如果比较规则有多个,并且需要多个比较规则之间频繁切换。建议什么呀,使用接口。啊,Compare接口。Competor接口的设计符合OCP原则,注意啊,它的设计是符合OCP原则的competitor。
14:10
它可以切换呀。对吧,可以切换。后续的程序不用改,只需要切换这个什么比较器的接口,我们是不是就可以完成不同的比较方式啊。因为你每一个比较器里边编辑的这个比较规则是不是不一样啊。对吧,所以说比较规则不发生改变,就用comparable,如果比较规则经常发生改变,那就用compar,你像这个string啊,像in teacher啊,他都去实现comparable,它的比较规则是不会发生改变的,所以它实现了这个接口。啊。我们来看看日期类型,Date。加va.u包下的这个date。这个类。Class点过去,大家看这个是不是也实现了comparable啊?
15:00
是不是啊,也实现了这个,所以说明日期是可以比较的。字符串是可以比较的。Int类型,Integer是可以比较的。如果你想让你的小乌龟可以比较,那你需要让你的小乌龟实现那个comparable接口。如果没有实现comparable接口,你需要在你创建集合的时候给他传递一个比较对象进去,这样的话它才可以完成比较。啊。行,这样的话,我们集合这一块,各位啊就结束了,各位啊结束了。那么吹map集合。哈希map集合底层的这个数据结构呢,大家下去之后呢,好好想一想啊,想一想这个数据结构啊,想想数据结构。另外要知道哈希map还有tree map,它对应的实际上就是这个哈西set和什么呀,Tree set往这个里边放,实际上就相当于放到了这个map机和的部分,这个map机的T部分。明白什么意思吧?哎,这要知道啊,这要知道。
16:00
好了,那么这一块呢,咱们就说到这儿啊,这是集合这一块的一个东西。
我来说两句