《Java与面向对象程序》-7.3 Set接口_第1页
《Java与面向对象程序》-7.3 Set接口_第2页
《Java与面向对象程序》-7.3 Set接口_第3页
《Java与面向对象程序》-7.3 Set接口_第4页
《Java与面向对象程序》-7.3 Set接口_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学习目标掌握HashSet、TreeSet集合的含义和用法主要内容HashSet集合TreeSet集合Set接口

Set接口和List接口都继承自Collection接口。与List接口不同,Set接口不允许出现重复元素,集合中的元素位置无序,有且只有一个值为null的元素。Set接口主要有HashSet和TreeSet两个实现类。其中,HashSet是根据对象的哈希值来确定元素在集合中的位置,因此具有良好的存取和查找性能;TreeSet是以二叉树的方式来存储元素,它可以对集合中的元素进行排序。7.3.1HashSet集合

HashSet存储的元素是不可重复的,并且元素都是无序的。【例7-10】HashSet集合的使用importjava.util.*;publicclassEx7_10{ publicstaticvoidmain(String[]args){ HashSetset=newHashSet();//创建HashSet集合 set.add("Kevin");//向该Set集合中添加字符串 set.add("Mary"); set.add("Eve"); set.add("Mary");//向该Set集合中添加重复元素 set.add("Jack"); Iteratorit=set.iterator(); //获取Iterator对象 while(it.hasNext()){//通过while循环,判断集合中是否有元素 Objectobj=it.next(); //通过迭代器的next()方法获取元素 System.out.println(obj); } System.out.println("pleaseinputthename:"); Scannersc=newScanner(System.in); //从键盘输入要查询的名字 Stringname=sc.next(); if(set.contains(name)) //判断集合中是否存在此名字 System.out.println(name+"isexist."); else System.out.println(name+"isnotexist."); set.remove("Kevin"); //从集合中删除Kevin System.out.println("Kevinisremoved.nowthesetis:"+set); }}7.3.1HashSet集合

HashSet集合是如何做到添加的元素不出现重复的呢?关键是存入对象的hashCode()和equals()方法:向HashSet中存入对象时,首先调用存入对象的hashCode()方法获得对象的哈希值,然后根据对象的哈希值计算出一个存储位置。如果该位置上没有元素,则将元素存入;如果该位置上已有元素,则调用equals()方法比较这两个元素是否相同,如果不相同,则通过探测再散列的方法找到一个新的不冲突的存储位置,将该元素存入集合;如果相同,说明是重复元素,则不存入集合。7.3.1HashSet集合

为了保证HashSet正常工作,要求被存入对象应重写hashCode()和equals()方法。如例7-10中将字符串存入HashSet时,String类已经重写了hashCode()和equals()方法。但是如果将没有重写这两个方法的Person对象存入HashSet,结果又如何呢?下面通过一个例子来进行演示。【例7-11】在HashSet中存入没有重写hashCode()和equals()方法的对象importjava.util.*;classPerson{ Stringid; Stringname; publicPerson(Stringid,Stringname){//创建构造方法 this.id=id; =name; } publicStringtoString(){ //重写toString()方法 returnid+":"+name; }}publicclassEx7_11{ publicstaticvoidmain(String[]args){ HashSeths=newHashSet(); //创建HashSet集合 Personp1=newPerson("1","John");//创建Person对象 Personp2=newPerson("2","Eva"); Personp3=newPerson("2","Eva"); hs.add(p1); hs.add(p2); hs.add(p3); System.out.println(hs); }}7.3.1HashSet集合

【例7-12】在HashSet中存入重写了hashCode()和equals()方法的对象importjava.util.*;classPerson{ privateStringid; privateStringname; publicPerson(Stringid,Stringname){ this.id=id; =name; }//重写toString()方法 publicStringtoString(){ returnid+":"+name; }//重写hashCode方法 publicinthashCode(){ returnid.hashCode();//返回id属性的哈希值 }//重写equals方法 publicbooleanequals(Objectobj){ Personp=(Person)obj;//将对象强转为Person类型 return this.id==p.id;//返回判断结果 }}publicclassEx7_12{ publicstaticvoidmain(String[]args){ HashSeths=newHashSet();//创建HashSet对象 Personp1=newPerson("1","John");//创建Person对象 Personp2=newPerson("1","Regan"); Personp3=newPerson("2","Eva"); Personp4=newPerson("2","Eva"); Personp5=newPerson("3","Eva"); hs.add(p1); //向集合存入对象 hs.add(p2); hs.add(p3); hs.add(p4); hs.add(p5); System.out.println(hs); //打印集合中的元素 }}7.3.1HashSet集合

7.3.2TreeSet集合

TreeSet是一个有序的Set集合,具有Set的属性和方法。它支持一系列的导航方法。比如查找与指定目标最匹配项。它能被克隆,支持序列化。它内部采用自平衡的排序二叉树来存储元素。

7.3.2TreeSet集合

所谓二叉树就是每个结点最多有两棵子树,即二叉树中的每个结点至多有两个子结点,且每个子结点都有各自的位置关系,通常左侧的子结点称为“左子树”,右侧的子结点称为“右子树”,以只有三个结点的二叉树为例,其所有形态如图7-22所示。

图7-22三个结点的二叉树的所有形态7.3.2TreeSet集合

二叉树的种类很多,TreeSet集合内部使用的是自平衡的排序二叉树,它的特点是存储的元素会按照大小排序,并能去除重复元素。例如向一个TreeSet集合依次存入8个元素:10、7、12、9、1、12、11、27,其存储结构会形成一个排序二叉树的形态,如图7-23所示。

图7-23排序二叉树7.3.2TreeSet集合

表7-5TreeSet中定义的方法7.3.2TreeSet集合

【例7-13】TreeSet集合的使用importjava.util.*;publicclassEx7_13{ publicstaticvoidmain(String[]args){

TreeSetts=newTreeSet();//创建TreeSet集合

ts.add("Tom");//向TreeSet集合中添加元素

ts.add("Eve"); ts.add("Lucy"); ts.add("Eve"); ts.add("Susan"); ts.add("Jane");

Iteratorit=ts.iterator();//获取Iterator对象

while(it.hasNext()){ System.out.println(it.next()); }

System.out.println("集合逆序视图:"+ts.descendingSet()); System.out.println("集合中最小值:"+ts.first()); System.out.println("集合中最大值:"+ts.last()); }}7.3.2TreeSet集合

在TreeSet集合中存放Person类型对象时,如果Person类没有实现Comparable接口,则Person类型的对象将不能进行比较,这时,TreeSet集合就不知道按照什么规则对Person对象进行排序。因此,为了在TreeSet集合中存放Person对象,必须使Person类实现Comparable接口,如例7-14所示。

7.3.2TreeSet集合

【例7-14】在TreeSet集合中存储实现Comparable接口的对象importjava.util.*;classPersonimplementsComparable{ //定义Person类实现Comparable接口

Stringname; intage; publicPerson(Stringname,intage){//创建构造方法

=name; this.age=age; } publicStringtoString(){ //重写Object类的toString()方法,返回描述信息

returnname+":"+age; } publicintcompareTo(Objectobj){//重写Comparable接口的compareTo方法

Personp=(Person)obj; //将比较对象强转为Person类型

if(this.age>p.age){ //判断二者age的大小

return1; } if(this.age==p.age){ returnpareTo(); //若age相等,则按name比较大小

} return-1; }}publicclassEx7_14{ publicstaticvoidmain(String[]args){ TreeSetts=newTreeSet();//创建TreeSet集合

ts.add(newPerson("Tom",21));//向集合中添加元素

ts.add(newPerson("Eve",20)); ts.add(newPerson("Lucy",21)); ts.add(newPerson("Eve",20)); Iteratorit=ts.iterator(); while(it.hasNext()){ System.out.println(it.next()); } }}7.3.2TreeSet集合

有时候,定义的类没有实现Comparable接口或者实现了Comparable接口而不想按照定义的compareTo()方法进行排序。例如,希望字符串可以按照长度排序,这时,可以通过自定义比较器的方式对TreeSet集合中的元素排序,即实现Comparator接口的intcompare(Objecto1,Objecto2)方法来制定排序规则,该方法用来比较排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。按照Java规范应满足自反性、传递性、一致性的约定,否则会抛出异常。下面通过一个例子实现TreeSet集合中字符串按照长度进行排序。

7.3.2TreeSet集合

【例7-15】在TreeSet集合中存入元素按字符串长度排序importjava.util.*;classPersonimplementsComparable{ //定义Person类实现Comparable接口

Stringname; intage; publicPerson(Stringname,intage){//创建构造方法

=name; this.age=age; } publicStringtoString(){ //重写Object类的toString()方法,返回描述信息

returnname+":"+age; } publicintcompareTo(Objectobj){ //重写Comparable接口的compareTo方法

Personp=(Person)obj; //将比较对象强转为Person类型

if(this.age>p.age){ //判断二者age的大小

return1; } if(this.age==p.age){ returnpareTo();//若age相等,则按name比较大小

} return-1; }}

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论