文档章节

比较器

K
 Karl0
发布于 2016/10/27 21:24
字数 828
阅读 16
收藏 0

         在TreeSet中,元素的添加需要进行比较大小。但是,集合中的元素都是引用类型的数据没有大小可言,这时我们就可以针对元素的某一个属性比较大小。如果这个元素的属性值大于那个元素的属性值,我们就可以认为这个元素比那个元素大,这样就可以将对象存入TreeSet中了。

         有两种方式可以解决这个问题:

         1.定义要放入TreeSet中的对象的类时实现Comparable接口。

         例如,要将Person对象放入TreeSet中,那么在定义Person类时首先要声明实现Comparable接口,然后实现compareTo()方法。

         public class Person implements Comparable{

        

                  //此处省略JavaBean定义的基本步骤

        

                  @Override

                  public int compareTo(Object o){

                            if(o instanceof Person){

                                     Person p = (Person)o;

                                     return this.age - p.age;

                            }

                            throws new RuntimeException("对象不可比!");

                  }

        

         }

         由上面代码可以看出,在实现compareTo()方法的时候,首先需要判断一下比较的对象是不是Person类,如果不是就没有意义,就会抛出异常。但是,由于Object类没有抛出异常,所以它的子类Person类抛出的异常要比Object类范围小,所以不能声明throws异常。因此,受检异常就不能被抛出,只能抛出非受检异常RuntimeException。如果比较对象是Person类型,那么首先要造型,将Object引用转换成Person类型,然后返回本对象的属相值与被比较对象的属性值的差(这里用年龄做比较)。如果本对象的年龄比被比较对象的年龄大,那么返回值是正数;如果小返回负数;如果相等则返回0。最后TreeSet会按照返回的值来判断Person对象的大小。这样,就能将Person类型的对象存入TreeSet中了。

 

         2. 创建一个比较器实现Comparator接口,在比较器中实现compare()方法。创建TreeSet时将比较器作为构造器的参数传入。

         public class PersonComparator implements Comparator{

        

                  @Override

                   public int compare(Object o1, Object o2){

                            if(o1 instanceof Person && o2 instanceof Person){

                                     return ((Person)o1).getAge() - ((Person)o2).getAge();

                            }

                            throw new RuntimeException("对象不可比!");

                   }

        

         }

         由上面代码可以看出,两种方案是大同小异的,都需要实现比较接口。它们的不同之处在于:

         ①实现接口的位置不同。

         第一种方案是在原类上声明实现Comparable接口,并且在原类中实现compareTo()方法。这个方法时属于这个类中的成员的。而第二种方案是自己写一个类做为比较器,这个比较器声明实现Comparator接口并实现compare()方法,原类是不需要进行任何改变的。

         ②compareTo()方法只有一个参数,那就是被比较对象,而调用者是比较对象。compara()方法有两个参数,分别是需要比较的两个对象。

         ③在使用第一种方案时创建HashSet对象时构造器不需要传入任何参数,因为比较已经作为Person类本身的特性了。而使用第二种方案创建HashSet对象时需要将比较器当做参数传入HashSet的构造器中,因为这时Person类并没有比较的特性。

         Set set = new HashSet(new PersonComparator());

 

 

                                                                                                                                by Karl

 

© 著作权归作者所有

上一篇: 多线程
下一篇: 集合
K
粉丝 0
博文 22
码字总数 15549
作品 0
北京
私信 提问
似懂非懂 Comparable和 Comparator

在java中提供了两种排序方式:Comparable和 Comparator,它们两个看起来非常的相似,在不是很了解的情况下不知道如何使用,什么情况下使用哪个进行排序,接下来就看下它们的一个区别和使用方...

tsmyk0715
2018/09/29
1K
0
硬件设计6---什么是滞回电路

时间:2018.2.1 作者:Tom 工作:HWE 说明:如需转载,请注明出处。 1. 简单电压比较器回顾 电压比较器是一种常用的集成电路。它可用于报警器电路、自动控制电路、测量技术,也可用于V/F变换...

wangdapao12138
2018/02/10
0
0
Java 中 Comparable 和 Comparator 比较

本文,先介绍Comparable 和Comparator两个接口,以及它们的差异;接着,通过示例,对它们的使用方法进行说明。 Comparable 简介 Comparable 是排序接口。 若一个类实现了Comparable接口,就意...

foxeye
2016/03/01
75
0
对象数组自定义排序--System.Collections.ArrayList.Sort()

使用System.Collections.ArrayList.Sort()对象数组自定义排序 其核心为比较器的实现,比较器为一个类,继承了IComparer接口并实现int IComparer.Compare(Object x, Object y)方法,该方法实现...

我家的小萌珊
07/05
0
0
java的Set接口详解

set接口是继承于collection接口,是collection的一个分支. 一.hashSet 1.hashSet是可以用来去除集合中的重复的元素 代码举例: HashSet 结果为: 2.LinkedHashSet是hashSet的子类,特点是去重 有...

zxc1258012580的博客
2017/12/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins World 贡献者峰会及专家答疑展位

本文首发于:Jenkins 中文社区 原文链接 作者:Marky Jackson 译者:shunw Jenkins World 贡献者峰会及专家答疑展位 本文为 Jenkins World 贡献者峰会活动期间的记录 Jenkins 15周岁啦!Jen...

Jenkins中文社区
22分钟前
6
0
杂谈:面向微服务的体系结构评审中需要问的三个问题

面向微服务的体系结构如今风靡全球。这是因为更快的部署节奏和更低的成本是面向微服务的体系结构的基本承诺。 然而,对于大多数试水的公司来说,开发活动更多的是将现有的单块应用程序转换为...

liululee
37分钟前
6
0
OSChina 周二乱弹 —— 我等饭呢,你是不是来错食堂了?

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ 自行车丢了:给主编推荐首歌 《クリスマスの夜》- 岡村孝子 手机党少年们想听歌,请使劲儿戳(这里) @烽火燎原 :国庆快来,我需要长假! ...

小小编辑
今天
409
9
玩转 Springboot 2 之热部署(DevTools)

Devtools 介绍 SpringBoot 提供了热部署的功能,那啥是热部署累?SpringBoot官方是这样说的:只要类路径上的文件发生更改,就会自动重新启动应用程序。在IDE中工作时,这可能是一个有用的功能...

桌前明月
今天
5
0
CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部