Java程序设计课件5第五章:集合_第1页
Java程序设计课件5第五章:集合_第2页
Java程序设计课件5第五章:集合_第3页
Java程序设计课件5第五章:集合_第4页
Java程序设计课件5第五章:集合_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

《JAVA程序设计》课程1、

Java集合框架主要内容2、List接口、泛型3、Iterator(迭代器)接口Java程序设计4、Set接口、Map接口5、LinkedHashMap类6、Collections类7、Comparable与Comparator接口《JAVA程序设计》课程

学习目标:1.了解Java集合框架的构成2.掌握实现List接口的相关类用法3.掌握泛型的用法4.掌握用Iterator(迭代器)接口遍历集合的方法5.掌握Set接口、Map接口的用法6.掌握用Collections类处理集合问题的方法《JAVA程序设计》课程

5.1List接口5.1.1项目描述

设计一个程序完成扑克牌游戏“斗地主”的随机发牌功能,输出发牌结果(以扑克牌大小、花色为序)。5.1.2项目知识准备(1)集合概述

集合是具有共同性质的一类元素构成的一个整体。Java中设计了集合框架(JavaCollectionsFramework,简称JCF),对与集合相关的一些数据结构和算法进行封装。JCF的内容如图5.1,其中短虚线表示接口,实线表示接口的具体实现。JCF中最关键的接口有3个:List、Set和Map,其特点是:List接口继承自Collection,里面的元素可以重复,元素有先后顺序;Set接口继承自Collection,里面的元素不能重复,元素无先后顺序;Map接口是“键-值”对的集合,关键字不能重复,元素无先后顺序。《JAVA程序设计》课程

5.1List接口图5.1简化的集合框架图《JAVA程序设计》课程

5.1List接口(2)List接口提供的方法List接口提供了对线性列表进行操作的一系列方法,如添加、删除集合元素,获取、搜索集合元素等,常用方法如下:booleanadd(Objectelement)将指定的元素element添加到此列表的末尾。voidadd(intindex,Objectelement)将指定的元素element插入此列表中的位置index。booleanaddAll(Collectionc)将集合c中的所有元素添加到此列表末尾(添加顺序为集合c元素的遍历顺序)。booleanaddAll(intindex,Collectionc)将集合c中的所有元素插入此列表中的位置index(插入顺序为集合c元素的遍历顺序)。Objectremove(intindex)移除此列表中位置index上的元素。booleanremove(Objectelement)从列表中移除指定元素element。booleanremoveAll(Collectionc)从列表中移除指定集合c中包含的所有元素。booleanretainAll(Collectionc)仅在列表中保留指定集合c中所包含的元素。voidclear()移除此列表中的所有元素。《JAVA程序设计》课程

5.1List接口booleanisEmpty()测试此列表是否为空。intsize()返回此列表中的元素数。Objectget(intindex)返回此列表中位置index上的元素。Objectset(intindex,Objectelement)用元素element替代此列表中位置index上的元素。booleancontains(Objectelem)如果此列表中包含指定的元素,则返回true。intindexOf(Objectelement)搜索元素element第一次出现的位置,如果列表中不包含此元素,则返回-1。intlastIndexOf(Objectelement)搜索元素element最后一次出现的位置,如果列表中不包含此元素,则返回-1。ListsubList(intfromIndex,inttoIndex)返回列表中fromIndex(包括)和toIndex(不包括)之间的部分元素集合。Object[]toArray()返回包含列表中的所有元素的数组。ListIteratorlistIterator()返回元素的列表迭代器。ListIteratorlistIterator(intindex)返回元素的列表迭代器(从位置index开始)。《JAVA程序设计》课程

5.1List接口(3)ArrayList和LinkedList

List接口有ArrayList和LinkedList两种实现,实际应用时根据需要进行选择:1)ArrayList

●ArrayList适合元素添加、删除操作不频繁的情况,支持元素的随机访问

●ArrayList的构造方法:ArrayList()构造一个初始容量为10的空列表。ArrayList(Collectionc)构造一个包含指定集合c的元素的列表。ArrayList(intinitialCapacity)构造一个具有指定初始容量的空列表。2)LinkedList

●LinkedList适合元素添加、删除操作频繁,但顺序的访问列表元素的情况。

●LinkedList的构造方法:LinkedList()构造一个空列表。LinkedList(Collectionc)构造一个包含指定集合c的元素的列表。《JAVA程序设计》课程

5.1List接口

●除了List接口规定的方法,LinkedList的实现方法还有:voidaddFirst(Objectelement)将给定元素插入此列表的开头。voidaddLast(Objectelement)将给定元素追加到此列表的结尾。ObjectgetFirst()返回此列表的第一个元素。ObjectgetLast()返回此列表的最后一个元素。ObjectremoveFirst()移除并返回此列表的第一个元素。ObjectremoveLast()移除并返回此列表的最后一个元素。

下面的程序对List的基本功能进行测试,从实践角度了解List的用法:

案例5-1:List基本功能测试importjava.util.*;publicclassTest{ publicstaticvoidmain(String[]args){ Listlst=newArrayList();《JAVA程序设计》课程

5.1List接口lst.add(100); lst.add(100.0); lst.add("Hello"); lst.add(newDate()); for(inti=0;i<lst.size();i++)//遍历集合元素 { System.out.print("第"+i+"个元素---"); Objectobj=lst.get(i);//获取第i个元素 System.out.print("类型:"+obj.getClass().getName()+","); System.out.println("值:"+obj.toString()); } }}《JAVA程序设计》课程

5.1List接口程序运行结果如图5.2:图5.2List基本功能测试

提醒:List的添加方法参数类型为Object,意味着可以存放任意对象,体现了List这种容器的包容特性。当参数为基本类型时,会被自动封装为对应类型的对象(如int类型的参数会被封装为Integer对象)。《JAVA程序设计》课程

5.1List接口(4)泛型

在JDK1.5之前,通过将类型定义为Object来实现参数类型“任意化”,在使用时,要将参数进行显式的强制类型转换,这种转换在开发者对参数具体类型预先知晓的情况下才能进行。对于强制类型转换错误的情况,编译器时不会提示错误,在运行的时候才出现异常,造成安全隐患。另外,将集合元素的类型定义为Object,任意类型的对象都可以存入集合,不便于对集合元素进行归类。

泛型是JDK1.5的新特性,泛型的本质是数据类型参数化,即所操作的数据类型被指定为一个参数。数据类型参数化可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

下面的举例说明泛型类的用法:案例5-2:泛型类的定义和使用classGeneral<T>//该类中会用到T类型(此时类型尚未确定){privateTobj;//定义泛型成员变量publicGeneral(Tobj){《JAVA程序设计》课程

5.1List接口

this.obj=obj;}

publicTgetObj(){returnobj;}

publicvoidsetObj(Tobj){this.obj=obj;}

publicvoidshowType(){System.out.println("T的实际类型是:"+obj.getClass().getName());}

}publicclassTest{《JAVA程序设计》课程

5.1List接口publicstaticvoidmain(String[]args){//定义并创建泛型类General的对象,T类型具体化为Integer

General<Integer>intObj=newGeneral<Integer>(100);intObj.showType();inti=intObj.getObj();System.out.println("value="+i);//定义并创建泛型类General的对象,T类型具体化为StringGeneral<String>strObj=newGeneral<String>("Hello!");strObj.showType();Strings=strObj.getObj();System.out.println("value="+s);}}《JAVA程序设计》课程

5.1List接口程序运行结果如图5.3图5.3泛型类的定义和使用JDK1.5以后的集合类都支持泛型,例如List的定义为: publicinterfaceList<E>extendsCollection<E> add方法定义为:booleanadd(Eelement)voidadd(intindex,Eelement)《JAVA程序设计》课程

5.1List接口(5)泛型通配和泛型限定1)泛型通配符

在引用泛型类时,无法预先知道泛型类被具体化为什么类型,所以语法上需要用借助通配符来描述。

泛型通配符用“?”表示,例如,Collections类的reverse方法实现列表元素逆序,该方法申明为:publicstaticvoidreverse(List<?>list)

这样的申明表示,参数可以和元素为任意类型的列表匹配,如List<String>、List<Integer>均可。2)泛型限定符●extends限定符通配符“?”对类型未加任何限制,但在某些时候需要对类型进行限定,例如,在JDK1.5中,List接口的addAll方法申明为:booleanaddAll(Collection<?extendsE>c)其中“?extendsE”表示具体类别必须是E类或E类的子类(派生自E类)。●super限定符除了extends限定之外,还有super限定,例如Collections类的copy方法实现列表的拷贝,方法申明为:static<T>voidcopy(List<?superT>dest,List<?extendsT>src)《JAVA程序设计》课程

5.1List接口

其中第一个参数为目标列表,其中的“?superT”表示类型必须是T类或T类的父类,第二个参数为源列表,其中“?extendsT”表示具体类别必须是T类或T类的子类,这样从语法层面保证类型匹配。(6)利用Collections处理列表Collections类提供了一系列静态方法来对List的元素进行处理,常用的有复制、排序、逆序、比较、混淆、循环移动等,这些方法定义如下:

●复制:将所有元素从列表src复制到列表deststatic<T>voidcopy(List<?superT>dest,List<?extendsT>src)

●交换元素:将位置i和j处的元素交换staticvoidswap(List<?>list,inti,intj)

●比较:如果两个指定collection中没有相同的元素,则返回truestaticbooleandisjoint(Collection<?>c1,Collection<?>c2)

●逆序:反转指定列表中元素的顺序staticvoidreverse(List<?>list)《JAVA程序设计》课程

5.1List接口

●混淆:

使用默认随机源混淆列表的元素顺序staticvoidshuffle(List<?>list)

使用指定随机源混淆列表的元素顺序staticvoidshuffle(List<?>list,Randomrnd)

●循环移动:根据指定的距离循环移动列表中的元素staticvoidrotate(List<?>list,intdistance)

●排序:

根据元素的自然顺序,对指定列表按升序进行排序static<TextendsComparable<?superT>>voidsort(List<T>list)

根据比较器c产生的顺序对指定列表进行排序static<T>voidsort(List<T>list,Comparator<?superT>c)

在列表元素排序过程中,需要进行元素比较,Java中采取两种方法来实现,一种是让集合元素自身实现Comparable接口,另一种是用实现Comparator接口的第三方比较器进行比较。

《JAVA程序设计》课程

5.1List接口Comparable接口定义为:publicinterfaceComparable<T>{//比较当前对象和参数o//根据当前对象小于、等于或大于参数o,分别返回负数、零或正数。 intcompareTo(To);}Comparator接口定义为:publicinterfaceComparator<T>{//比较参数o1和o2//根据参数o1小于、等于或大于参数o2,分别返回负数、零或正数。 intcompare(To1,To2);}《JAVA程序设计》课程

5.1List接口

根据定义可知,这两个接口具有通用性,能用于任何类型对象的比较。

下面的通过实例来理解两种接口的用法:

案例5-3:Comparable和Comparator接口测试importjava.util.*;classEmployeeimplementsComparable<Employee>{ //Comparable接口规定要实现的方法 publicintcompareTo(Employeee){ //比较当前象与指定对象e的顺序。 //如果当前对象小于、等于或大于指定对象,则分别返回负数、零或正数。 returnthis.titleIdx-e.titleIdx; } publicStringname;//职称编号(1-技术员,2-助理工程师,3-工程师,4-高级工程师)《JAVA程序设计》课程

5.1List接口publicinttitleIdx;//学历编号(1-小学,2-中学,3-专科,4-本科,5-研究生) publicintdegreeIdx; publicEmployee(Stringname,inttitleIdx,intdegreeIdx){ =name; this.titleIdx=titleIdx; this.degreeIdx=degreeIdx; }}

//Employee对象的比较器(以职称作为比较依据)classEmpTitleComparatorimplementsComparator<Employee>{ //Comparator接口规定要实现的方法《JAVA程序设计》课程

5.1List接口publicintcompare(Employeee1,Employeee2){ //比较当前象e1与指定对象e2的顺序。 //如果e1小于、等于或大于指定e2,则分别返回负数、零或正数。 returne1.titleIdx-e2.titleIdx; }}//Employee对象的比较器(以学历作为比较依据)classEmpDegreeComparatorimplementsComparator<Employee>{ //Comparator接口规定要实现的方法 publicintcompare(Employeee1,Employeee2){ //比较当前象e1与指定对象e2的顺序。//如果e1小于、等于或大于指定e2,则分别返回负数、零或正数。 returne1.degreeIdx-e2.degreeIdx; }}《JAVA程序设计》课程

5.1List接口publicclassTest{ publicstaticvoidmain(String[]args){ Employeee1=newEmployee("张三",3,3);//职称:工程师,学历:专科 Employeee2=newEmployee("李四",2,4);//职称:助理工程师,学历:本科 if(pareTo(e2)>0) System.out.println(+"的职称排在"++"前面"); elseif(pareTo(e2)<0) System.out.println(+"的职称排在"++"前面"); else System.out.println(+"和"++"职称相同"); EmpTitleComparatorcmp1=newEmpTitleComparator(); if(pare(e1,e2)>0) System.out.println(+"的职称排在"++"前面"); elseif(pare(e1,e2)<0)《JAVA程序设计》课程

5.1List接口System.out.println(+"的职称排在"++"前面"); else System.out.println(+"和"++"职称相同"); EmpDegreeComparatorcmp2=newEmpDegreeComparator(); if(pare(e1,e2)>0) System.out.println(+"的学历排在"++"前面"); elseif(pare(e1,e2)<0) System.out.println(+"的学历排在"++"前面"); else System.out.println(+"和"++"学历相同"); }}程序运行结果如图5.4《JAVA程序设计》课程

5.1List接口图5.4Comparable和Comparator接口测试

提醒:集合元素自身实现Comparable接口时,只能依据一种标准进行比较(例子中只依据职称进行比较),用实现Comparator接口的第三方比较器,则可以通过实现多个比较器,从多个方面进行比较(例子中两个比较器分别对职称和学历进行比较)。

根据上述两种元素的比较方法,可以对元素为任意类型的列表进行排序,Java的Collections类已经实现了用来排序的sort方法,下面的程序用冒泡排序法自己实现一遍,进一步理解Comparable和Comparator接口的用法。《JAVA程序设计》课程

5.1List接口案例5-4:使用Comparable和Comparator接口排序importjava.util.*;classEmployeeimplementsComparable<Employee>{ //(略)同案例5-3}//Employee对象的比较器(以职称作为比较依据)classEmpTitleComparatorimplementsComparator<Employee>{ //(略)同案例5-3}//Employee对象的比较器(以学历作为比较依据)classEmpDegreeComparatorimplementsComparator<Employee>{ //(略)同案例5-3}《JAVA程序设计》课程

5.1List接口classCollectionTools//集合工具类(模拟Collections类){ //冒泡排序(从大到小,借助Comparable接口) publicstatic<TextendsComparable<?superT>>voidsort(List<T>list) { Ttmp; for(inti=0;i<=list.size()-2;i++) for(intj=0;j<=list.size()-2-i;j++) { Tobj1=list.get(j); Tobj2=list.get(j+1); if(pareTo(obj2)<0)//用Comparable对象的方法进行比较 {《JAVA程序设计》课程

5.1List接口tmp=list.get(j);

list.set(j,list.get(j+1));

list.set(j+1,tmp); } } }//冒泡排序(从大到小,借助Comparator接口) static<T>voidsort(List<T>list,Comparator<?superT>c) { Ttmp; for(inti=0;i<=list.size()-2;i++) for(intj=0;j<=list.size()-2-i;j++) { Tobj1=list.get(j); Tobj2=list.get(j+1);《JAVA程序设计》课程

5.1List接口if(pare(obj1,obj2)<0)//用Comparator对象的方法进行比较

{ tmp=list.get(j); list.set(j,list.get(j+1)); list.set(j+1,tmp); } } }}publicclassTest{

publicstaticvoidmain(String[]args){ List<Employee>empList=newArrayList<Employee>(); empList.add(newEmployee("赵六",1,2));//职称:技术员,学历:高中 empList.add(newEmployee("张三",3,3));//职称:工程师,学历:专科 empList.add(newEmployee("李四",2,4));//职称:助理工程师,学历:本科《JAVA程序设计》课程

5.1List接口empList.add(newEmployee("王五",4,5));//职称:高级工程师,学历:研究生 CollectionTools.sort(empList); System.out.print("使用Comparable排序(默认按职称排序)\n");

for(inti=0;i<empList.size();i++)

System.out.print(empList.get(i).name+"");

System.out.print("\n使用Comparator按职称排序\n"); CollectionTools.sort(empList,newEmpTitleComparator());

for(inti=0;i<empList.size();i++)

System.out.print(empList.get(i).name+"");System.out.print("\n使用Comparator按学历排序\n");CollectionTools.sort(empList,newEmpDegreeComparator());

for(inti=0;i<empList.size();i++)System.out.print(empList.get(i).name+""); }}《JAVA程序设计》课程

5.1List接口程序运行结果如图5.5图5.5使用Comparable和Comparator接口排序

提醒:JDK提供了Collection类,其中的sort方法与例子中的定义完全一样,将main函数中的CollectionTools.sort改为Collections.sort,即可以对列表进行排序。5.1.3项目实施1)功能分析《JAVA程序设计》课程

5.1List接口斗地主游戏发牌程序要实现的功能包括:

●用一个类表示一张扑克牌;

●用一个列表cards来存储所有的牌,再用三个列表分别存放各个玩家的牌,并用一个列表p_cards来统一管理三个玩家扑克牌列表;

●发牌时,首先将cards中的元素顺序打乱(洗牌),再依次将最上面的牌取出,添加到各个玩家的扑克牌列表中,最后将每个玩家的列表进行排序;

●将三个玩家的牌和底牌输出。(2)编码通过分析我们可以编写以下代码实现功能:importjava.util.*;classCard{ //牌面符号表 privatestaticStringface[]=newString[]{"J","Q","K","A","2","小王","大王"};《JAVA程序设计》课程

5.1List接口//花色表 privatestaticStringsuit[]=newString[]{"♦","♣","♥","♠"}; privateintrank;//牌的点数 privateintsuitIdx;//花色编号 publicintgetRank(){ returnrank; } publicintgetSuitIdx(){ returnsuitIdx; } publicCard(intrank,intsuitIdx)//构造方法 {this.rank=rank;this.suitIdx=suitIdx; }《JAVA程序设计》课程

5.1List接口publicStringtoString()//显示输出(重载Object的toString方法) { if(rank<=10)returnsuit[suitIdx]+rank; elseif(rank<=15)returnsuit[suitIdx]+face[rank-11]; elsereturnface[rank-11];//大小王不显示花色 }}

//扑克牌对象的比较器(以点数、花色作为比较依据)classCardComparatorimplementsComparator<Card>{ //Comparator接口规定要实现的方法 publicintcompare(Cardc1,Cardc2){ if(c1.getRank()==c2.getRank())//点数相同比较花色《JAVA程序设计》课程

5.1List接口 returnc2.getSuitIdx()-c1.getSuitIdx(); returnc2.getRank()-c1.getRank(); }}publicclassTest{ publicstaticvoidmain(String[]args){ List<Card>cards=newArrayList<Card>(); List<List<Card>>p_cards=newArrayList<List<Card>>(); for(inti=0;i<3;i++)//创建每个玩家的列表对象p_cards.add(newArrayList<Card>()); for(inti=3;i<=15;i++)//11到15分别表示J、Q、K、A、2 for(intj=0;j<4;j++)//4中花色cards.add(newCard(i,j));//添加扑克到集合中cards.add(newCard(16,0));//添加小王《JAVA程序设计》课程

5.1List接口Cards.add(newCard(17,0));//添加大王 Collections.shuffle(cards);//洗牌 CardComparatorcomparator=newCardComparator(); //分发给3个玩家 for(inti=0;i<3;i++) { for(intj=0;j<17;j++)//每个玩家依次取17张牌 p_cards.get(i).add(cards.remove(0)); Collections.sort(p_cards.get(i),comparator);//对每个玩家的牌进行排序 } //显示输出 for(inti=0;i<3;i++) { System.out.print("第"+(i+1)+"个玩家:");

《JAVA程序设计》课程

5.1List接口for(intj=0;j<p_cards.get(i).size();j++) System.out.print(p_cards.get(i).get(j).toString()+"");

System.out.println(); } System.out.print("底牌:"); for(inti=0;i<cards.size();i++) System.out.print(cards.get(i).toString()+""); }}(3)调试运行,显示结果该程序的运行结果如图5.6所示:《JAVA程序设计》课程

5.1List接口图5.6斗地主游戏发牌结果4.1.4能力拓展(1)选择题①List中的元素是(

)A.有序且不能重复的B.有序且可以重复的

C.无序且不能重复的D.无序且可以重复的《JAVA程序设计》课程

5.1List接口②表示泛型所使用的符号是(

)A.[]B.{}C.<>D.()③在申明方法时,要求列表的元素类型为T类或其子类,下列申明正确的是(

)A.List<T>B.List<?>C.List<?superT>D.List<?extendsT>④关于Comparable和Comparator接口,下列说法错误的是(

)A.可以供Collections.sort方法使用,用于排序中元素大小的比较B.一个类实现了Camparable接口,表明这个类的对象之间是可以相互比较的C.Comparator比较固定,和一个具体类相绑定,Comparable比较灵活,它可以被各个需要比较功能的类使用D.Comparable只能实现一种排序标准,Comparator可以实现多种排序标准⑤下列哪个方法是LinkedList类有而ArrayList类没有的(

)A.add(Objecto)B.add(intindex,Objecto)C.remove(Objecto)D.removeLast()《JAVA程序设计》课程

5.1List接口(2)填空题

①java集合框架的四种主要接口是Collection、

、Set。

②Comparable接口规定要实现的方法是

,Comparator接口规定要实现的方法是

③Collections是一个工具类,所有方法都是

方法。(3)编程题

①约瑟夫问题:n只猴子要选猴王,所有的猴子按照1,2,........n编号围成一圆,从第1号开始按1,2,....m报数,凡是报m的猴子退出圈外,如此循环直到圈内剩下一只猴子,这只猴子就是猴王。编写程序解决该问题,n和m由键盘输入。

②在斗地主游戏发牌程序的基础上,增加随机确定一名玩家为“地主”的功能,并且将三张底牌加到“地主”的牌中,并按从大小、花色排序输出。

③在List的基础上设计堆栈(Stack)、队列(Queue)类,实现这两个类的基本功能。《JAVA程序设计》课程5.2Set和Map接口5.2.1项目描述设计一个选举得票统计程序,输入选票上勾选的候选人姓名,统计每个候选人的得票数,并按从多到少排序。5.2.2项目知识准备(1)Set概述 Set接口也继承自Collection,表示多个元素的集合,与List不同的是,Set中包含的元素是无序的,并且不能重复。在JDK1.5中,Set接口定义是: publicinterfaceSet<E>extendsCollection<E>Set接口提供的方法如下:booleanadd(Eo)如果set中不存在指定的元素o,则添加此元素。booleanaddAll(Collection<?extendsE>c)如果Set中不存在集合c中包含的元素,则将其添加到Set中。voidclear()清除Set中的所有元素。《JAVA程序设计》课程5.2Set和Map接口booleancontains(Objecto)如果Set包含元素o,则返回true。booleancontainsAll(Collection<?>c)如果Set包含集合c的所有元素,则返回true。booleanisEmpty()如果Set为空(不包含元素),则返回true。Iterator<E>iterator()返回Set的迭代器,用于遍历集合。booleanremove(Objecto)如果Set中存在元素o,则将其移除。booleanremoveAll(Collection<?>c)移除Set中那些包含在集合c中的元素。booleanretainAll(Collection<?>c)仅保留Set中那些包含在集合c中的元素。intsize()返回Set中的元素个数。Object[]toArray()返回包含Set中所有元素的数组。(2)Set的遍历对比Set和List的方法可以发现,Set中没有get、set方法,无法通过顺序号对元素进行访问,所以遍历List的方法不能用于Set。为了解决这个问题,JCF中引入Iterator(迭代器)接口,来遍历无序集合,凡是实现了Iterable接口的类的对象,都可以获取到迭代器,并通过迭代器遍历集合元素。《JAVA程序设计》课程5.2Set和Map接口Iterator<E>接口提供的方法如下: booleanhasNext()判断是否还有元素可以获取,是则返回true。 Enext()返回获取到的下一个元素。voidremove()从集合中移除迭代器获取到的最后一个元素。下面是一段遍历Set的程序:案例5-5:遍历Setimportjava.util.*;publicclassTest{ publicstaticvoidmain(String[]args){//Set接口的具体实现是HashSet类 Set<String>books=newHashSet<String>();books.add("C程序设计");books.add("Java编程基础");books.add("Java编程基础");《JAVA程序设计》课程5.2Set和Map接口books.add("软件工程"); Iterator<String>it=books.iterator(); while(it.hasNext())//判断是否存在下一个元素 { Stringbook=it.next();//取出一个元素 System.out.println(book); } }}

提醒:Set中的元素是无序的,所以输出的结果和添加时的顺序可能不一样。另外,Set中的元素不能重复,相同的项目只能添加一次。(3)Map接口概述Map是键-值对的集合,相当于是一个只有“关键字(key)”和“值(value)”两列的一个表,关键字是无序的,并且不能重复。在JDK1.5中,Map接口定义是:《JAVA程序设计》课程5.2Set和Map接口publicinterfaceMap<K,V>Map接口提供的方法如下:Vput(Kkey,Vvalue)添加一个键-值对到集合中,如果关键字存在,则修改对应值。Vget(Objectkey)获取关键字对应的值。intsize()返回该Map中的键-值对的数量。Vremove(Objectkey)如果存在关键字key,则将该键-值对从Map中移除。voidclear()移除集合中所有的键-值对。booleancontainsKey(Objectkey)如果集合中包含指定的关键字,则返回true。booleancontainsValue(Objectvalue)如果集合中包含指定的值,则返回true。Set<Map.Entry<K,V>>entrySet()返回Map包含所有实体(存入Set中)。booleanisEmpty()判断Map中是否包含键-值对,如未包含则返回true。Set<K>keySet()返回Map中所有关键字(存入Set中)。Collection<V>values()返回Map中所有值(存入Collection中)voidputAll(Map<?extendsK,?extendsV>t)从参数指定Map中将所有键-值对复制到当前Map。《JAVA程序设计》课程5.2Set和Map接口(4)Map的遍历案例5-6:遍历Mapimportjava.util.*;importjava.util.Map.Entry;publicclassTest{ publicstaticvoidmain(String[]args){ Map<String,String>books=newHashMap<String,String>(); books.put("A001","C程序设计"); books.put("A002","Java编程基础"); books.put("A003","软件工程"); //使用包含key的Set进行遍历 Set<String>bookNo=books.keySet();//只包含key的Set Iterator<String>it=bookNo.iterator(); while(it.hasNext()) {《JAVA程序设计》课程5.2Set和Map接口StringNo=it.next(); StringName=books.get(No); System.out.println(No+","+Name); } //使用包含Entry的Set进行遍历 Set<Entry<String,String>>kvs=books.entrySet();//包含键-值的Set Iterator<Entry<String,String>>it2=kvs.iterator(); while(it2.hasNext()) { Entry<String,String>kv=it2.next(); System.out.println(kv.getKey()+","+kv.getValue()); }}}《JAVA程序设计》课程5.2Set和Map接口

提醒:Map的遍历方法是将Map转换为Set,再获取Iterator进行遍历。可以获取只包含key的Set,遍历时根据key得到value,也可以获取包含Entry(键-值对)的Set,直接进行遍历。(5)foreach循环Java中的foreach循环本质上调用了Iterator接口,凡是实现了Iterable接口的类实例,都可以用foreach循环进行遍历。Foreach循环的语法格式如下:for(元素类型对象名称:集合){

//处理单个对象}下面通过例子来体验foreach循环的用法:案例5-7:用foreach循环遍历集合importjava.util.*;importjava.util.Map.Entry;

publicclassTest{

《JAVA程序设计》课程5.2Set和Map接口publicstaticvoidmain(String[]args){

System.out.print("遍历数组:");inta[]=newint[]{1,2,3,4,5}; for(inti:a) System.out.print(i); System.out.print("\n遍历List:"); List<String>list=newArrayList<String>(); list.add("spring");list.add("summer");list.add("autumn");list.add("winter"); for(Strings:list) System.out.print(s+"");

System.out.print("\n遍历Set:"); Set<String>set=newHashSet<String>(); set.add("spring");set.add("summer");set.add("autumn");set.add("winter"); for(Strings:set)《JAVA程序设计》课程5.2Set和Map接口System.out.print(s+""); System.out.print("\n遍历Map:"); Map<String,String>map=newHashMap<String,String>(); map.put("01","spring");map.put("02","summer");map.put("03","autumn");map.put("04","winter"); for(Entry<String,String>kv:map.entrySet()) System.out.print(kv.getKey()+","+kv.getValue()+""); }}该程序的运行结果如图5.7所示:图5.7用foreach循环遍历集合《JAVA程序设计》课程5.2Set和Map接口

提醒:foreach是Java中的一种“语法糖”,这种语法对语言的功能没有影响,但是更方便程序员使用。本质上foreach循环遍历和Iterator遍历没有区别,只是程序书写上更加简洁。5.2.3项目实施(1)功能分析程序运行时,从键盘输入得票人编号,将该候选人票数加1。为了能快速通过编号找到记录,将编号作为Map的关键字,得票人的相关信息封装成Vote类,将Vote对象作为值。得票数排序借助List来完成,调用Map接口的Values方法得到所有Vote对象,并添加到List中,借助工具类Collections的sort方法完成排序。为了配合sort方法,Vote类实现Comparable接口。(2)编码通过分析我们可以编写以下代码实现功能:importjava.util.*;classVoteimplementsComparable<Vote>{《JAVA程序设计》课程5.2Set和Map接口publicStringID;//候选人编号 publicintcount;//候选人得票数 publicVote(StringID,intcount){ this.ID=ID; this.count=count; } publicintcompareTo(Votev){//Comparable接口的方法 returnv.count-this.count; }}publicclassTest{ publicstaticvoidmain(String[]args){Map<String,Vote>votes=newHashMap<String,Vote>(); //初始化候选人集合《JAVA程序设计》课程5.2Set和Map接口votes.put("01",newVote("01",0)); votes.put("02",newVote("02",0)); votes.put("03",newVote("03",0)); votes.put("04",newVote("04",0));

System.out.println("请录入得票人编号:"); Scanner

温馨提示

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

评论

0/150

提交评论