版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、主讲教师 张 智计算机学院软件工程系10 集合框架10.1 集合概述10.2 Collection10.3 Iterator10.4 List10.5 Set10.6 Map10.7 排序重点:10.1-10.4(ArrayList)其他了解一下特点即可10.1 集合概述通常情况下,把具有相同性质的一类东西,汇聚成一个整体,就可以称为集合。 Java集合框架均在java.util包中。 虚线框表示接口。实线框表示实体类。粗线框表示最常用的实体类。点线的箭头表示实现接口。实线箭头表示类可以制造箭头所指的那个类的对象。 Collection接口List接口LinkedList (链表)ArrayL
2、ist (线性表)VectorStackSet接口是一组成对的键值对象(key-value)不能有重复的key,但可有重复value是一组允许重复的对象,对象之间没有指定的顺序允许重复对象之间没有指定的顺序添加了面向位置的操作不允许重复对象之间没有指定的顺序没有引入新方法实现类实现类Map接口Hashtable (哈希表)HashMapWeakHashMap 【Return】10.2 CollectionCollection是最基本的集合接口,一个Collection代表一组Object(注意:集合必须只有对象,集合中的元素不能是基本数据类型)。Collection 是一组允许重复的对象,对象
3、之间没有指定的顺序。基本操作(1)元素添加、删除操作boolean add(Object element) boolean remove(Object element)(2)查询操作:int size():返回当前集合中元素的数量boolean isEmpty():当前集合是否为空boolean contains(Object el) :当前集合是否包含el对象。Iterator iterator():返回一个迭代器,用于遍历集合各个元素。10.3节讲解Iterator基本操作(续)(3)组操作:boolean containsAll(Collection c):集合中是否包含集合c所有元素b
4、oolean addAll(Collection c):将集合c中的元素添加给该集合void clear():删除集合中所有元素void removeAll(Collection c):从集合中删除集合c中的所有元素void retainAll(Collection c):从集合中删除集合c中不包含的元素(4)Collection转换为Object数组Object toArray() :返回一个内含集合所有元素的数组Object toArray(Object a):返回一个内含集合所有元素的数组,该数组和参数a的类别相同。Collection示例 import java.util.*;publ
5、ic class CollectionToArray public static void main(String args) Collection c1=new ArrayList(); /创建一个集合对象 c1.add(000); c1.add(111); c1.add(222); /添加对象到Collection集合中 System.out.println(集合c1的大小:+ c1.size() ); System.out.println(集合c1的内容:+ c1 ); /可直接输出 c1.remove(000); /从集合c1中移除掉 000 这个对象 System.out.print
6、ln(集合c1移除 000 后的内容:+ c1 ); System.out.println(集合c1中是否包含000 :+ c1.contains(000) ); System.out.println(集合c1中是否包含111 :+ c1.contains(111) ); Collection c2=new ArrayList(); c2.addAll(c1); /将c1 集合中的元素全部都加到c2中 System.out.println(集合c2的内容:+ c2 ); c2.clear(); /清空集合 c1 中的元素 System.out.println(集合c2是否为空 :+ c2.is
7、Empty() ); /将集合c1转化为数组 Object s= c1.toArray(); for(int i=0;is.length;i+) System.out.println(si); 注意:Collection仅仅是一个接口,而真正使用的时候,是创建该接口的一个实现类(如ArrayList)。【Return】集合c1的大小:3集合c1的内容:000, 111, 222集合c1移除 000 后的内容:111, 222集合c1中是否包含000 :false集合c1中是否包含111 :true集合c2的内容:111, 222集合c2是否为空 :true11122210.3 Iterator
8、Iterator(迭代器)的功能就是遍历并选择集合序列中的对象,而程序员不必知道该序列底层的结构。创建迭代器的代价很小(轻量级),但是,它也有一些限制,例如,某些迭代器只能单向移动。Iterator基本操作(1)boolean hasNext():是否存在另一个可访问的元素。(2)Object next():返回要访问的下一个元素。(3)void remove():将迭代器新返回的元素删除。注意:remove()必须紧跟在next()方法后执行,在每次调用next()时,remove方法只能被调用一次。Iterator基本用法遍历一个集合Iterator it = Collection集合对象
9、.iterator(); / 获得迭代器while(it.hasNext() Object obj = it.next(); / 得到下一个元素/处理obj注意迭代器游标移动初始状态next()obj1obj2遍历完毕示例片段Collection c = new ArrayList();c.add(s1); c.add(s2); c.add(s3);Iterator it= c.iterator(); /得到一个迭代器while ( it.hasNext() ) /遍历 Object element = it.next(); System.out.println(element);if(c.i
10、sEmpty() System.out.println(集合空);else System.out.println(集合非空! size=+c.size();Iterator it2 = c.iterator();while ( it2.hasNext() ) /移除元素 Object element = it2.next(); System.out.println(remove: +element); it2.remove(); /该方法必须紧跟在next() 后 Iterator it3 = c.iterator();if ( it3.hasNext() ) System.out.print
11、ln(集合空);else System.out.println(collection is Empty!);【Return】s1s2s3集合非空! size=3remove: s1remove: s2remove: s3collection is Empty!10.4 ListList继承了 Collection 接口,以定义一个允许重复项的有序集合。List 是按对象的进入顺序进行保存对象,而不做排序或编辑操作。List除了拥有Collection接口的所有的方法外,还添加了面向位置的操作方法。面向位置的操作包括插入某个元素或 Collection 的功能;还包括获取、除去或更改元素的功能;
12、在 List 中搜索元素可以从列表的头部或尾部开始,如果找到元素,还将报告元素所在的位置。一些面向位置的操作方法void add(int index, Object el) :添加对象el到位置index上boolean addAll(int index, Collection c) :在index位置后添加容器c中所有的元素Object get(int index) :取出下标为index的位置的元素int indexOf(Object el) :查找对象el在List中第一次出现的位置int lastIndexOf(Object el) :查找对象el在List中最后出现的位置Object
13、 remove(int index) :删除index位置上的元素Object set(int index, Object el) :将index位置上的对象替换为el并返回老的元素。List subList(int fromIndex, int toIndex) :返回一个子列表List,范围是 fromIndex, toIndex)元素。List迭代器ListIterator listIterator() 返回一个ListIterator 迭代器,默认开始位置为0。ListIterator listIterator(int startIndex) 返回一个ListIterator 迭代器,
14、开始位置为startIndex。 ListIterator 接口继承了 Iterator 接口 支持添加或更改底层集合中的元素 支持双向访问ListIterator基本用法逆向遍历ListIterator it = list.listIterator( list.size() ); / list为一个List对象while ( it.hasPrevious() ) Object element = it.previous(); / 处理元素注意 遍历完毕previous()obj1obj2初始状态objN注意迭代器游标移动示例片段List list = new ArrayList();list
15、.add(aaa); list.add(bbb); list.add(ccc); list.add(ddd); System.out.println(下标0开始:+ list.listIterator(0).next() ); System.out.println(下标1开始:+ list.listIterator(1).next() );System.out.println(子List 1-3:+ list.subList(1,3) ); /子列表 ListIterator it = list.listIterator(); /默认从下标0开始it.add(sss); / 插入到当前游标处w
16、hile(it.hasNext() System.out.println(Index=+it.nextIndex()+,Object=+it.next(); ListIterator it1 = list.listIterator(); /默认从下标0开始it1.next(); /游标指向第一个元素it1.set(ooo); /替换当前游标处的元素为ooo“ListIterator it2 = list.listIterator(list.size(); /逆向遍历while(it2.hasPrevious() System.out.println(previous Index=+it2.pr
17、eviousIndex()+,Object=+it2.previous();下标0开始:aaa下标1开始:bbb子List 1-3:bbb, cccIndex=1,Object=aaaIndex=2,Object=bbbIndex=3,Object=cccIndex=4,Object=dddprevious Index=4,Object=dddprevious Index=3,Object=cccprevious Index=2,Object=bbbprevious Index=1,Object=aaaprevious Index=0,Object=oooList的两个常用实现简述实现操作特性
18、成员要求List 提供基于索引的对成员的随机访问 ArrayList 线性表提供快速的基于索引的成员访问,对尾部成员的增加和删除支持较好。 任意Object子类对象LinkedList链表 对列表中任何位置的成员的增加和删除支持较好,但对基于索引的成员访问支持性能较差。 任意Object子类对象ArrayList类 ArrayList封装了一个动态再分配的Object 数组。每个ArrayList对象有一个capacity,表示存储列表中元素数组的容量。当元素添加到ArrayList时,它的capacity将自动增加。在向一个ArrayList对象添加大量元素时,可使用ensureCapaci
19、ty()方法增加capacity。(1)void ensureCapacity(int minCapacity):将ArrayList对象容量增加minCapacity(2)void trimToSize():整理ArrayList对象容量为列表当前大小,使用该操作减少ArrayList对象存储空间。 LinkList类 LinkList添加了一些处理列表两端元素的方法:(1)void addFirst(Object o):将对象o添加到列表的开头 void addLast(Object o):将对象o添加到列表的结尾(2)Object getFirst():返回列表开头的元素 Object
20、getLast():返回列表结尾的元素(3)Object removeFirst():删除并返回列表开头的元素 Object removeLastt():删除并返回列表结尾的元素(4)LinkedList():创建一个空的链接列表 LinkedList(Collection c):创建一个链接列表,并添加集合c所有的元素 【Return】10.5 SetSet 接口继承 Collection 接口,而且它不允许集合中存在重复项。Set接口没有引入新方法,每个具体的 Set 实现类依赖添加的对象的 equals() 方法来检查独一性。即任意的两个元素e1和e2都有e1.equals(e2)=fa
21、lse。 Set接口的常用实现类 简述实现操作特性成员要求Set成员不能重复HashSet外部无序地遍历成员成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。TreeSet外部有序地遍历成员;附加实现了SortedSet, 支持子集等要求顺序的操作成员要求实现Comparable接口,或者使用Comparator构造TreeSet。成员一般为同一类型。LinkedHashSet外部按成员的插入顺序遍历成员成员与HashSet成员类似示例 import java.util.*;public class SetSortExample public
22、static void main(String args) Set set1 = new HashSet(); Set set2 = new LinkedHashSet(); for(int i=0;i5;i+) /产生一个随机数,并将其放入Set中 int s=(int) (Math.random()*100); set1.add(new Integer( s); set2.add(new Integer( s); System.out.println(第 +i+ 次随机数产生为:+s); System.out.println(未排序前HashSet:+set1); System.out.p
23、rintln(未排序前LinkedHashSet:+set2); /使用TreeSet来对另外的Set进行重构和排序 Set sortedSet = new TreeSet(set1); System.out.println(排序后 TreeSet :+sortedSet); 该程序的一次执行结果为:第 0 次随机数产生为:96第 1 次随机数产生为:64第 2 次随机数产生为:14第 3 次随机数产生为:95第 4 次随机数产生为:57未排序前HashSet:64, 96, 95, 57, 14未排序前LinkedHashSet:96, 64, 14, 95, 57排序后 TreeSet :
24、14, 57, 64, 95, 96【Return】10.6 Map映射这种数据结构含有两个部分:关键字和值。对于每个关键字都有一个值,也就是说,一个关键字映射一个值。映射允许通过关键字访问数据结构。Map接口中声明了一对一的映射。当向映射中插入一对关键字和值时,如果出现关键字重用,则用新值替换映射中原有的值,不在映射中增加一个元素。 基本操作 (1)添加、删除操作Object put(Object key,Object value)将一个键值对存放到Map中。如果出现关键字已存在,则用新值替换映射中原有的值。该方法返回关键字的旧值,如果关键字原先就不存在,则返回null。Object rem
25、ove(Object key)根据key(键),移除一个键值对,并将值返回。void putAll(Map mapping)将另外一个Map中的元素存入当前的Map中。void clear() 清空当前Map中的元素。(2)查询操作:Object get(Object key):根据key(键)取得对应的值boolean containsKey(Object key) :判断Map中是否存在某键(key)boolean containsValue(Object value):判断Map中是否存在某值(value)int size():返回Map中 键-值对的个数boolean isEmpty(
26、):判断当前Map是否为空(3)允许把键或值的组作为集合来处理:public Set keySet() :返回所有的键(key,唯一性),并使用Set容器存放 。public Collection values() :返回所有的值(Value,可重复 ),并使用Collection存放。public Set entrySet() :返回一个实现 Map.Entry 接口的元素 Set。(见示例)Map实现类简述实现操作特性成员要求Map保存键值对成员,基于键找值操作,使用compareTo或compare方法对键进行排序HashMap存入顺序和输出顺序无关能满足用户对Map的通用需求键成员可为
27、任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法TreeMap支持对键有序地遍历,使用时建议先用HashMap增加和删除成员,最后从HashMap生成TreeMap;附加实现了SortedMap接口,支持子Map等要求顺序的操作键成员要求实现Comparable接口,或使用Comparator构造TreeMap键成员一般为同一类型。LinkedHashMap保留键的插入顺序,用equals 方法检查键和值的相等性成员与HashMap成员类似示例 1import java.util.*;public class MapTest public static
28、 void main(String args) Map map1 = new HashMap(); Map map2 = new HashMap(); map1.put(1,aaa1); map1.put(2,bbb2); map2.put(10,aaaa10); map2.put(11,bbbb11);/根据键 1 取得值:aaa1 System.out.println(map1.get(1)=+map1.get(1);/根据键 1 移除键值对1-aaa1 System.out.println(map1.remove(1)=+map1.remove(1); System.out.printl
29、n(map1.get(1)=+map1.get(1); map1.putAll(map2); /将map2全部元素添加到map1中 map2.clear();/清空map2 System.out.println(map1 IsEmpty?=+map1.isEmpty(); System.out.println(map2 IsEmpty?=+map2.isEmpty(); System.out.println(map1 中的键值对的个数size = +map1.size(); System.out.println(KeySet=+map1.keySet(); /set System.out.pr
30、intln(values=+map1.values(); /Collection System.out.println(entrySet=+map1.entrySet(); System.out.println(map1 是否包含键:11 = +map1.containsKey(11); System.out.println(map1 是否包含值:aaa1 = +map1.containsValue(aaa1); map1.get(1)=aaa1map1.remove(1)=aaa1map1.get(1)=nullmap1 IsEmpty?=falsemap2 IsEmpty?=truemap
31、1 中的键值对的个数size = 3KeySet=10, 2, 11values=aaaa10, bbb2, bbbb11entrySet=10=aaaa10, 2=bbb2, 11=bbbb11map1 是否包含键:11 = truemap1 是否包含值:aaa1 = false示例 2import java.util.*;public class MapSortExample public static void main(String args) Map map1 = new HashMap(); Map map2 = new LinkedHashMap(); for(int i=0;i
32、0,表示当前对象应该排在方法中传过来对象的前面;0,表示当前对象应该排在方法中传过来对象的后面;=0,表示两个对象并列。重写compareTo目的:定义比较规则,使集合中的对象可以互相比较关于Collection和Collections java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个
33、工具类,服务于Java的Collection框架。Collections.sort(List list)可以实现元素的自然排序。自然排序 定义:从数学上讲,定义给定类 C 上自然排序的关系式 如下: (x, y)| pareTo(y) = 0。 类自然排序BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, Short 按数字从小到大排序Character 按 Unicode 值的从小到大排序Date 按年代从小到大排序String 按字符串中字符 Unicode 值从小到大排序示例import java.util.*;publ
34、ic class CompObj implements parable /定义要排序的类 int x; int y; public CompObj(int n1, int n2) x = n1; y = n2; public String toString() return x = + x + , y = + y + ; public int compareTo(Object o) /在该类中重写compareTo方法 CompObj co=(CompObj)o; /将传进来的对象转化成当前类型 if( this.x!=co.x ) return this.x-co.x; else retur
35、n this.y-co.y; 自定义排序规则:x值小的对象排在前面;如果x值相同,则y值小的对象排在前面.。测试public static void main(String args) ArrayList al=new ArrayList(); al.add( new CompObj(3,2) ); al.add( new CompObj(1,3) ); al.add( new CompObj(1,2) ); System.out.println(before sort); for(int i=0;ial.size();i+) System.out.println(al.get(i); Col
36、lections.sort(al); /调用Collections的sort方法静态方法 System.out.println(after sort); for(int i=0;ial.size();i+) System.out.println(al.get(i); 运行结果为:before sortx = 3, y = 2x = 1, y = 3x = 1, y = 2after sortx = 1, y = 2x = 1, y = 3x = 3, y = 2Comparator接口Comparable是在类的内部重写compareTo()方法来实现的排序。在现实中,可能会遇到这样一个问题:
37、想对整数采用绝对值大小来排序,显然Integer自然排序是不符合要求的,同时Integer类也不容许你在它的内部重写compareTo()去改变它的排序行为,怎么办? 解决办法Java语言提供了一个比较器 parator;只要在比较器的compare()方法中定义两个对象之间的比较规则即可;然后调用java.util.Collections.sort(List list, Comparator c)方法。 int compare(Object o1, Object o2)方法:返回负数表示o1位于o2之前;返回0 表示o1和o2相等(表示两个对象排在同一位置),返回正数表示o1位于o2之后。
38、2个参数Comparator示例 import java.util.*;class parator implements parator public int compare(Object o1,Object o2) CompObj co1=(CompObj)o1; /转化成当前类型的对象 CompObj co2=(CompObj)o2; if( co1.y!=co2.y ) return co1.y-co2.y; else return co1.x-co2.x; 定义一个比较器自定义排序规则:y值小的对象排在前面;如果y值相同, 则x值小的对象排在前面.测试public class Comp
39、Obj /无需实现Comparable接口 int x; int y; public CompObj(int n1, int n2) x = n1; y = n2; public String toString() return x = + x + , y = + y + ; public static void main(String args) ArrayList al=new ArrayList(); al.add(new CompObj(3,2); al.add(new CompObj(1,3); al.add(new CompObj(1,2); System.out.println(
40、before sort); for(int i=0;ial.size();i+) System.out.println(al.get(i); Collections.sort( al, new parator() ); System.out.println(after sort); for(int i=0;i v2 ? 1 : (v1 = v2 ? 0 : -1); 编程练习Person类:id,name,age;请按age升序排序、按id降序排序。Person类public class Person private final int id; private String name; pri
41、vate int age; public Person(int id,String name,int age) this.id = id; = name; this.age = age; public int getId() return id; public void setName(String name) = name; public String getName() return name; public void setAge(int age) this.age = age; public int getAge() return age; pu
42、blic String toString() return Id: + id + tName: + name + tAge: + age; 两个比较器import java.util.*;class cmpAge implements Comparator / 按Age降序排序public int compare(Object obj1, Object obj2) Person p1=(Person)obj1; Person p2=(Person)obj2; return p1.getAge()-p2.getAge(); class cmpId implements Comparator /
43、按Id升序排序public int compare(Object obj1, Object obj2) Person p1=(Person)obj1; Person p2=(Person)obj2; return p2.getId()-p1.getId(); 测试public class test public static void main(String args) ArrayList al = new ArrayList(); al.add(new Person(1003, 张三,18); al.add(new Person(1008, 李四,21); al.add(new Person
44、(1015,王五,19); al.add(new Person(1001,赵六,20); Collections.sort(al, new cmpAge() ); System.out.println(按年龄升序排序:); Iterator it1 = al.iterator(); while(it1.hasNext() System.out.println(it1.next(); Collections.sort(al, new cmpId() ); System.out.println(按ID降序排序:); Iterator it2 = al.iterator(); while(it2.hasNext() System.out.println(it2.next(); 补充给数组排序可以使用java.util.Arrays.sort方法。对于boolean以外的基本类型,Arrays.sort有两种变化:Arrays.sort( array )用来为整个数组排序。Arrays.sort( array , int fromIndex, int toIndex)用来
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 带状镁合金牺牲阳极技术介绍
- 2026年高中秋季洪涝后防疫科普
- 2026年5月6日业务学习考试试题
- 湖北省咸宁市2025-2026学年高三冲刺模拟生物试卷含解析
- 2026基因检测服务下沉市场开发与渠道建设策略深度分析
- 2026中国药品研发行业市场前沿研究报告及创新技术与市场发展趋势分析报告
- 2026皮革制品行业市场消费分析及工艺革新与品牌价值提升报告
- 2026中国体育融资行业市场现状供需分析及投资评估规划分析研究报告
- 2026中国涡流泵行业物流成本分析与配送网络优化报告
- 2026年初中化学期末测试卷结合培训
- 2023-2024学年北京市通州区高二(下)期中语文试卷
- 2026年(综合知识测试)湖北省从村(社区)干部中定向考录乡镇(街道)公务员综合练习题及答案
- 2026年新闻记者职业资格考试试卷及答案(共十三套)
- 2025年资阳市园区产业发展服务专员岗位招聘考试试卷真题
- 监狱财务制度规定
- 吊柜制作安装专项施工方案
- 医院领导ab角工作制度
- 妇产科妊娠合并糖尿病护理规范培训
- DG-T 285-2023 鲜食玉米收获机
- 高新企业认定汇报材料
- 机动绞磨机安全培训课件
评论
0/150
提交评论