版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、网 络 程 序 设 计,JAVA网络程序设计 SsandyYao,1,骄阳书苑,泛型与集合框架,P136 例7-7 P137 例7-8 P140 例7-10 P141 例7-11 P143 例7-12,2,骄阳书苑,P145 例7-13 P146 例7-14 P148 例7-15 P149 作业题3-4,泛型与集合框架,3,骄阳书苑,1 LinkedList泛型类 2 HashSet泛型类 3 HashMap泛型类 4 TreeSet泛型类 5 TreeMap泛型类 6 Stack泛型类,泛型与集合框架,4,骄阳书苑,什么是集合框架,集合框架:是为表示和操作集合而规定的一种统一标准的体系结构。
2、 集合中只能容纳对象。 对象会自动扩展,以容纳添加到其中的所有对象。 Java 2的集合类型被统一组织在Java集合框架(Java Collections Framework)当中,5,骄阳书苑,什么是集合框架,Java的集合框架提供了一套设计优良的接口和类,使程序员操作成批的数据或对象元素极为方便,极大的减化了程序员编程时的负担。 Java的集合框架的核心接口为:Collection、Map、Iterator,这三个接口是以后要使用的最重要,最多的接口。 Java 2的集合类型被统一组织在Java集合框架(Java Collections Framework)当中,6,骄阳书苑,什么是集合框
3、架,7,骄阳书苑,什么是集合框架,按具体集合类使用上的特性来分的话,主要有三类:List、Set和Map。 List是有序的,但允许重复。 Set是无序的,但不允许重复。 Map主要表现的是键值对的概念,8,骄阳书苑,集合与数组的区别,数组是定长,即创建后固定不变;集合是不定长的,其长度可以动态增长或减少。 数组是同构的,即数组中的元素是相同的类型;集合可以是异构的,当然也可以通过泛型创建类型安全的同构集合。 数组中可以存放基本数据类型或对象;集合只存放对象,9,骄阳书苑,Collection接口,Collection接口是在整个Java集合中List和Set的父接口,此接口定义如下: pub
4、lic interface Collection extends Iterable 此接口使用了泛型,10,骄阳书苑,Collection接口,常用方法: add(E e)/remove(Object o) 添加或移除元素。 clear() 清空集合中的所有元素。 contains(Object o) 如果此集合包含指定的元素,则返回true。 iterator() 返回在此集合内的元素的迭代器。 size() 获取集合 中的元素个数。 toArray()/toArray(T a) 返回包含些集合中的所有元素的数组,11,骄阳书苑,List接口,List是Collection的子接口,里面的所
5、有内容都是允许重复。 它在Collection接口的基础上做了不少的扩展。比较典型的方法有:add(),get(),remove(),listIterator(,12,骄阳书苑,什么是迭代器模式,迭代器模式:提供一种方法,它能够用来遍历(访问)集合的部分或全部元素,而又不暴露其内部的表示。 Java的集合框架已经实现好了迭代器模式,只需要使用即可,13,骄阳书苑,什么是链表,以链式结构存储的线性表称之为线性链表。 特点是该线性表中的数据元素可以用任意的存储单元来存储。线性表中逻辑相邻的两元素的存储空间可以是不连续的。为表示逻辑上的顺序关系,对表的每个数据元素除存储本身的信息之外,还需存储一个指
6、示其直接衔接的信息。这两部分信息组成数据元素的存储映象,称为结点,14,骄阳书苑,7.4 LinkedList泛型类,使用LinkedList泛型类可以创建链表结构的数据对象。链表是由若干个节点组成的一个种数据结构,每个节点含有一个数据和下一个节点的引用(单链表),或含有一个数据以及上一个节点的引用和下一个节点的引用(双链表),节点的索引从0开始。链表适合动态改变它存储的数据,如增加、删除节点等,15,骄阳书苑,7.4 LinkedList泛型类,1、LinkedList对象 java.util包中的LinkedList泛型类创建的对象以链表结构存储数据,习惯上称LinkedList类创建的对
7、象为链表对象。例如, LinkedList mylist=new LinkedList(,16,骄阳书苑,7.4 LinkedList泛型类,创建一个空双链表。然后mylist可以使用add(String obj)方法向链表依次增加节点,节点中的数据是参数obj指定对象的引用,如: mylist.add(“How”); mylist.add(“Are”); mylist.add(“You”,17,骄阳书苑,7.4 LinkedList泛型类,mylist.add(“Java”); 这时,双链表mylist就有了4个节点,节点是自动连接在一起的,不需要我们再去做连接。也就是说,不需要我们去操作安
8、排节点中所存放的下一个或上一个节点的引用,18,骄阳书苑,7.4 LinkedList泛型类,2、常用方法 以下是LinkedList泛型类的一些常用方法: public boolean add(E element)向链表的末尾添加一个新的节点,该节点中的数据是参数element指定的对象,19,骄阳书苑,7.4 LinkedList泛型类,public void add(int index,E element)向链表的指定位置添加一个新的节点,该节点中的数据是参数element指定的对象。 public void addFirst(E element)向链表的头添加一个新的节点,该节点中的数
9、据是参数element指定的对象,20,骄阳书苑,7.4 LinkedList泛型类,public void addLast(E element)向链表的末尾添加一个新的节点,该节点中的数据是参数element指定的对象。 public void clear()删除链表中的所有节点,使当前链表成为空链表,21,骄阳书苑,7.4 LinkedList泛型类,public E remove(int index)删除链表中指定位置上的节点。 public boolean remove(E element)删除首次出现含有数据element的节点。 public E removeFirst()删除链表
10、中第一个节点,并返回这个节点中的对象,22,骄阳书苑,7.4 LinkedList泛型类,public E removeLast()删除链表中最后一个节点,并返回这个节点中的对象。 public E get(int index)得到链表中指定位置处节点中的对象。 public E getFirst()得到链表中第一个节点的对象,23,骄阳书苑,7.4 LinkedList泛型类,public E getLast()得到链表中最后一个节点的对象。 public int indexOf(E element)返回含有数据element的节点在链表中首次出现的位置,如果链表中无此节点则返回-1。 pu
11、blic int lastindexOf(E element)返回含有数据element的节点在链表中最后出现的位置,如果链表中无此节点则返回-1,24,骄阳书苑,7.4 LinkedList泛型类,public E set(int index,E element)将当前链表index位置节点中的对象替换为参数element指定的对象,并返回被替换的对象。 public int size()返回链表的长度,即节点的个数,25,骄阳书苑,7.4 LinkedList泛型类,public boolean contains(Object element)判断链表节点中是否有节点含有对象element
12、。 public Object clone()得到当前链表的一个克隆链表,该克隆链表中的节点数据的改变不会影响到当前链表中节点的数据,反之亦然,26,骄阳书苑,例7-7,import java.util.*; class Student String name; int score; Student(String name,int score) =name; this.score=score;,27,骄阳书苑,例7-6,public class Example7_7 public static void main(String args) LinkedList mylist=
13、new LinkedList(); Student stu1=new Student(张小一,78), stu2=new Student(王小二,98), stu3=new Student(李大山,67); mylist.add(stu1); mylist.add(stu2,28,骄阳书苑,例7-7,mylist.add(stu3); int number=mylist.size(); System.out.println(现在链表中有+number+个节点:); for(int i=0;inumber;i+) Student temp=mylist.get(i); System.out.pr
14、intf(第+i+节点中的数据,学生:%s,分数:%dn,,temp.score);,29,骄阳书苑,例7-7,Student removeSTU=mylist.remove(1); System.out.printf(被删除的节点中的数据是:%s,%dn,removeSTU.name,removeSTU.score); Student replaceSTU=mylist.set(1,new Student(赵钩林,68); System.out.printf(被替换的节点中的数据是:%s,%dn,replaceSTU.name,replaceSTU.score); numb
15、er=mylist.size(,30,骄阳书苑,例7-7,System.out.println(现在链表中有+number+个节点:); for(int i=0;inumber;i+) Student temp=mylist.get(i); System.out.printf(第+i+节点中的数据,学生:%s,分数:%dn,,temp.score);,31,骄阳书苑,例7-7,if(mylist.contains(stu1) System.out.println(链表包含+stu1+:); System.out.println(+,+stu1.score);
16、 else System.out.println(链表没有节点含有+stu1);,32,骄阳书苑,7.4 LinkedList泛型类,3、遍历链表 在例7-7中借助get()方法实现了遍历链表。我们可以借助泛型类Iterator实现遍历链表,一个链表对象可以使用iterator()方法返回一个Iterator类型的对象,该对象中每个数据成员刚好是链表节点中的数据,而且这些数据成员是按顺序存放在Iterator对象中的,33,骄阳书苑,7.4 LinkedList泛型类,如果链表是“Student类型”的链表,即链表节点中的数据是Student类创建的对象,那么该链表使用iterator()方法
17、返回一个Iterator类型的对象,该对象使用next()方法遍历链表,34,骄阳书苑,例7-8:遍历链表,import java.util.*; class Student String name ; int number; float score; Student(String name,int number,float score) =name; this.number=number; this.score=score;,35,骄阳书苑,例7-8:遍历链表,public class Example7_8 public static void main(String ar
18、gs) LinkedList mylist=new LinkedList(); Student stu_1=new Student(赵民 ,9012,80.0f), stu_2=new Student(钱青 ,9013,90.0f), stu_3=new Student(孙枚 ,9014,78.0f), stu_4=new Student(周右 ,9015,55.0f,36,骄阳书苑,例7-8:遍历链表,mylist.add(stu_1); mylist.add(stu_2); mylist.add(stu_3); mylist.add(stu_4); Iterator iter=mylist
19、.iterator(,37,骄阳书苑,例7-8:遍历链表,while(iter.hasNext() Student te=iter.next(); /使用next()方法遍历链表。 System.out.println(+ +te.number+ +te.score);,38,骄阳书苑,7.4 LinkedList泛型类,4、LinkedList泛型类实现的接口 LinkedList泛型类实现了泛型接口List,而List接口是Collection接口的子接口。LinkedList类中的绝大部分方法都是接口方法的实现。编程时,可以使用接口回调技术,即把LinkedList对象的引
20、用赋值给Collection接口或List接口变量,那么接口就可以调用实现的接口方法,39,骄阳书苑,7.4 LinkedList泛型类,5、JDK 1.5之前的LinkedList类 JDK 1.5之前没有泛型的LinkedList类,可以用普通的LinkedList创建一个链表对象,如: LinkedList mylist=new LinkedList(); 创建了一个空双链表,然后mylist链表可以使用add(Object obj)方法向这个链表依次添加节点,40,骄阳书苑,7.4 LinkedList泛型类,由于任何类都是Object类的子类,因此可以把任何一个对象作为链表节点中的对
21、象。需要注意的是,使用get()获取一个节点中的对象时,要用类型转制运算符转换回原来的类型,41,骄阳书苑,7.4 LinkedList泛型类,Java泛型的主要目的是可以建立具有类型安全的集合框架,如链表、散列表等数据结构,最重要的一个优点就是:在使用这些泛型类建立的数据结构时,不必进行强制类型转换,即不要求进行运行时类型检查,42,骄阳书苑,7.4 LinkedList泛型类,JDK 1.5是支持泛型的编译器,它将运行时类型检查提前到编译时执行,使得代码更加安全。如果使用旧版本的LinkedList类,SDK 1.5编译器会给出警告信息,但程序仍能正常运行,43,骄阳书苑,例7-9:旧版本
22、LinkedList的例子,import java.util.*; public class Example7_9 public static void main(String args) LinkedList mylist=new LinkedList(); mylist.add(It); /链表中的第一个节点。 mylist.add(is); /链表中的第二个节点。 mylist.add(a); /链表中的第三个节点。 mylist.add(door); /链表中的第四个节点。 int number=mylist.size(); /获取链表的长度,44,骄阳书苑,例7-8:旧版本Linke
23、dList的例子,for(int i=0;inumber;i+) String temp=(String)mylist.get(i); /必须强制转换取出的数据。 System.out.println(第+i+节点中的数据:+temp);,45,骄阳书苑,例7-8:旧版本LinkedList的例子,Iterator iter=mylist.iterator(); while(iter.hasNext() String te=(String)iter.next(); /必须强制转换取出的数据。 System.out.println(te);,46,骄阳书苑,7.4 LinkedList泛型类,注
24、:Java也提供了顺序结构的动态数组类ArrayList,数组采用顺序结构来存储数据。可以有效利用空间,可用于存储大量的数据。数组不适合动态改变它存储的数据,如增加、删除单元等。由于数组采用顺序结构存储数据,数组获得第n单元中的数据的速度要比链表获得第n单元中的数据快。类ArrayList的很多方法与类LinkedList类似,两者的本质区别就是:一个使用顺序结构,一个使用链表结构,47,骄阳书苑,Set接口,Set接口是Collection的子接口,Set内的元素是唯一的。 Set接口并没有对Collection接口进行扩展,但在具体方法的含义上进行了进一步的约定,48,骄阳书苑,7.5 H
25、ashSet泛型类,HashSet泛型类在数据组织上类似数学上的集合,可以进行“交”、“并”、“差”等运算。 1、HashSet对象 HashSet泛型类创建的对象称为集合,例如: HashSet set=new HashSet(,49,骄阳书苑,7.5 HashSet泛型类,那么set就是一个可以存储String类型数据的集合,set可以调用add(String s)方法将String类型数据添加到集合中,添加到集合中的数据称做集合的元素。集合不允许有相同的元素,也就是说,如果b已经是集合中的元素,那么再执行set.add(b)操作是无效的。集合对象的初始容量是16个字节,装载因子是0.75
26、。也就是说,如果集合添加的元素超过总容量的75时,集合的容量将增加一倍,50,骄阳书苑,7.5 HashSet泛型类,2、常用方法 以下是HashSet泛型类的常用方法: public boolean add(E o)向集合添加参数指定的元素。 public void clear()清空集合,使集合不含有任何元素,51,骄阳书苑,7.5 HashSet泛型类,public boolean contains(Object o)判断参数指定的数据是否属于集合。 public boolean isEmpty()判断集合是否为空。 public boolean remove(Object o)删除集合
27、中参数指定的元素,52,骄阳书苑,7.5 HashSet泛型类,public int size()返回集合中的元素个数。 Object toArray()将集合元素存放到数组中,并返回这个数组。 boolean containsAll(HashSet set)判断当前集合是否包含参数指定的集合。 public Object clone()得到当前集合的一个克隆对象,该对象中元素的改变不会影响到当前集合中的元素,反之亦然,53,骄阳书苑,7.5 HashSet泛型类,我们可以借助泛型类Iterator实现遍历集合,一个集合对象可以使用iterator()方法返回一个Iterator类型的对象,如
28、果集合是“Student类型”的集合,那么该链表使用iterator()方法返回一个Iterator类型的对象,该对象使用next()方法遍历集合,54,骄阳书苑,例7-10:遍历集合,import java.util.*; class Student String name; int score; Student(String name,int score) =name; this.score=score;,55,骄阳书苑,例7-10:遍历集合,public class Example7_10 public static void main(String args) Stu
29、dent zh=new Student(张红铭,77), wa=new Student(王家家,68), li=new Student(李佳佳,67); HashSet set=new HashSet(); HashSet subset=new HashSet(,56,骄阳书苑,例7-10:遍历集合,set.add(zh); set.add(wa); set.add(li); subset.add(wa); subset.add(li); if(set.contains(wa) System.out.println(集合set中含有:+);,57,骄阳书苑,例7-10:遍历集合,
30、if(set.containsAll(subset) System.out.println(集合set包含集合subset); int number=subset.size(); System.out.println(集合subset中有+number+个元素:); Object s=subset.toArray(,58,骄阳书苑,例7-10:遍历集合,for(int i=0;is.length;i+) System.out.printf(姓名:%s,分数:%dn,(Student)si).name,(Student)si).score); number=set.size(); System.
31、out.println(集合set中有+number+个元素:,59,骄阳书苑,例7-10:遍历集合,Iterator iter=set.iterator(); while(iter.hasNext() Student te=iter.next(); System.out.printf(学生:%s,分数:%dn,,te.score);,60,骄阳书苑,7.5 HashSet泛型类,3、集合的交、并与差 集合对象调用boolean addAll(HashSet set)方法可以与参数指定的集合求并运算,使得当前集合成为两个集合的并集。 集合对象调用boolean retainAll
32、(HashSet set)方法可以与参数指定的集合求交运算,使得当前集合成为两个集合的交集,61,骄阳书苑,7.5 HashSet泛型类,集合对象调用boolean removeAll(HashSet set)方法可以与参数指定的集合求差运算,使得当前集合成为两个集合的差集。(属于集合A,但不属于集合B的部分。) 参数指定的集合必须与当前集合是同种类型的集合,否则上述方法返回false,62,骄阳书苑,例7-11:求集合A、B的对称差集合,即求(A-B)(B-A,import java.util.*; public class Example7_11 public static void ma
33、in(String args) Integer one=new Integer(1), two=new Integer(2), three=new Integer(3), four=new Integer(4), five=new Integer(5), six=new Integer(6,63,骄阳书苑,例7-11:求集合A、B的对称差集合,即求(A-B)(B-A,HashSet A=new HashSet(), B=new HashSet(), tempSet=new HashSet(); A.add(one); A.add(two); A.add(three); A.add(four);
34、 B.add(one); B.add(two,64,骄阳书苑,例7-11:求集合A、B的对称差集合,即求(A-B)(B-A,B.add(five); B.add(six); tempSet=(HashSet)A.clone(); A.removeAll(B); /A变成调用该方法之前的A集合与B集合的差集。 B.removeAll(tempSet); /B变成调用该方法之前的B集合与tempSet集合的差集,65,骄阳书苑,例7-11:求集合A、B的对称差集合,即求(A-B)(B-A,B.addAll(A); /B就是最初的A与B的对称差。 int number=B.size(); Syste
35、m.out.println(A和B的对称差集合有+number+个元素:); Iterator iter=B.iterator(); while(iter.hasNext() Integer te=iter.next(); System.out.printf(%d,,Value();,66,骄阳书苑,7.5 HashSet泛型类,请同学们思考,为什么在这个地方不能直接把数据添加到集合当中去,67,骄阳书苑,7.5 HashSet泛型类,4、HashSet泛型类实现的接口 HashSet泛型类实现了泛型接口Set,而Set接口是Collection接口的子接口。HashSet类中的绝
36、大部分方法都是接口方法的实现。编程时,可以使用接口回调技术,即把HashSet对象的引用赋值给Collection接口变量或Set接口变量,那么接口就可以调用实现的接口方法,68,骄阳书苑,7.6 HashMap泛型类,HashMap也是一个很实用的类,HashMap对象采用散列表这种数据结构存储数据,习惯上称HashMap对象为散列映射对象。散列映射用于存储键/值数据对,允许把任何数量的键/值数据对存储在一起。键不可以发生逻辑冲突,两个数据项不要使用相同的键,如果出现两个数据项对应相同的键,那么先前散列映射中的键/值数据对将被替换,69,骄阳书苑,7.6 HashMap泛型类,散列映射在它需
37、要更多的存储空间时会自动增加容量。例如,如果散列映射的装载因子是0.75,那么当散列映射的容量被使用了75时,它就把容量增加到原始容量的2倍。对于数组和链表这两种数据结构,如果要查找它们存储的某个特定的元素却不知道它的位置,就需要从头开始访问元素直到找到匹配的为止;如果数据结构中包含很多的元素,就会浪费时间,70,骄阳书苑,7.6 HashMap泛型类,这时最好使用散列映射来存储要查找的数据,使用散列映射可以减少检索的开销。 散列方法不同于其他的查找方法(顺序查找、二分查找)。它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,无须任何比较就可以找到待查关键字,71,骄阳书苑,7.6
38、 HashMap泛型类,1、HashMap对象 HashMap泛型类创建的对象称为散列映射,例如: HashMap hashtable=new HashMap (,72,骄阳书苑,7.6 HashMap泛型类,那么,hashtable就可以存储键/值数据对,其中的键必须是一个String对象,键对应的值必须是Student对象。hashtable可以调用public V put(K key,V value)将键/值数据对存放到散列映射当中,同时返回键所对应的值,73,骄阳书苑,7.6 HashMap泛型类,2、常用方法 HashMap泛型类的常用方法: public void clear()清
39、空散列映射。 public Object clone()返回当前散列映射的一个克隆,74,骄阳书苑,7.6 HashMap泛型类,public boolean containsKey(Object key)如果散列映射有键/值数据对的值是参数指定的键,方法返回true,否则返回false。 public boolean containsValue(Object value)如果散列映射有键/值数据对的值是参数指定的值,方法返回true,否则返回false,75,骄阳书苑,7.6 HashMap泛型类,public V get(Object key)返回散列映射中使用key作为键的键/值对中的值
40、。 public boolean isEmpty()如果散列映射不含任何键/值对,方法返回true,否则返回false,76,骄阳书苑,7.6 HashMap泛型类,public V remove(Object key)删除散列映射中键为参数指定的键/值对,并返回键对应的值。 public int size()返回散列映射的大小,即散列映射中键/值对的数目,77,骄阳书苑,7.6 HashMap泛型类,3、遍历散列映射 如果想获得散列映射中所有键/值对中的值,首先使用: public Collection values() 方法返回一个实现Collection接口类创建的对象的引用,并要求将该
41、对象的引用返回到Collection接口变量中。values()方法返回的对象中存储了散列映射中所有键/值对中的“值”,这样接口变量就可以调用类实现的方法,如获取Iterator对象,然后输出所有的值,78,骄阳书苑,例7-12:遍历散列映射,import java.util.*; class Book String ISBN,name; Book(String ISBN,String name) =name; this.ISBN=ISBN;,79,骄阳书苑,例7-12:遍历散列映射,public class Example7_12 public static void ma
42、in(String args) Book book1=new Book(7302033218,C+基础教程), book2=new Book(7808315162,Java编程语言), book3=new Book(7302054991,J2ME无线设备编程); String key=7808315162,80,骄阳书苑,例7-12:遍历散列映射,HashMap table=new HashMap(); table.put(book1.ISBN,book1); table.put(book2.ISBN,book2); table.put(book3.ISBN,book3); if(table.
43、containsKey(key) System.out.println(table.get(key).name+有货);,81,骄阳书苑,例7-12:遍历散列映射,Book b=table.get(7302054991); System.out.println(书名:++,ISBN:+b.ISBN); int number=table.size(); System.out.println(散列映射中有+number+个元素:); Collection collection=table.values(,82,骄阳书苑,例7-12:遍历散列映射,Iterator iter=collec
44、tion.iterator(); while(iter.hasNext() Book te=iter.next(); System.out.printf(书名:%s,ISBN:%sn,,te.ISBN);,83,骄阳书苑,7.6 HashMap泛型类,4、HashMap泛型类实现的接口 HashMap泛型类实现了泛型接口Map,而HashMap类中的绝大部分方法都是Map接口方法的实现。编程时,可以使用接口回调技术,即把HashMap对象的引用赋值给Map接口变量,那么接口就可以调用实现的接口方法,84,骄阳书苑,7.7 TreeSet泛型类,TreeSet类是实现Set接口的类
45、,它的大部分方法都是接口方法的实现。TreeSet泛型类创建的对象称为树集。 树集是一个有序集合,可以按照任何顺序将元素插入到该集合,85,骄阳书苑,7.7 TreeSet泛型类,例如: TreeSet tree=new TreeSet(); 那么tree就是一个可以存储Student类型数据的集合,tree可以调用add(Student s)方法将Student类型的数据添加到树集中。存放到树集的对象按对象的串表示升序排列,86,骄阳书苑,7.7 TreeSet泛型类,TreeSet要求添加到树集中的节点对象必须实现Comparable接口,也就是创建实现Comparable接口类的对象。比
46、如,String类实现了Comparable接口中的compareTo(Object str)方法,字符串调用compareTo(String s)方法按字典序与参数s指定的字符串比较大小。也就是,87,骄阳书苑,7.7 TreeSet泛型类,TreeSet mytreenew TreeSet(); 然后就可以使用add()方法向树集中添加节点了。 Comparable 接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序,类的 compareTo 方法被称为它的自然比较方法,88,骄阳书苑,7.7 TreeSet泛型类,TreeSet泛型类的常用方法: public boo
47、lean add(E o)向树集添加对象,添加成功返回true,否则返回false。 public void clear()删除树集中的所有对象,89,骄阳书苑,7.7 TreeSet泛型类,public boolean contains(Object o)如果包含对象o方法返回true,否则返回false。 public E first()返回树集中的第一个对象(最小的对象)。 public E last()返回树集中的最后一个对象(最大的对象,90,骄阳书苑,7.7 TreeSet泛型类,public boolean isEmpty()判断是否是空树集,如果树集不含对象返回true。 pu
48、blic boolean remove(Object o)删除树集中的对象o。 public int size()返回树集中的对象数目,91,骄阳书苑,7.7 TreeSet泛型类,我们在创建树集时可自己规定树集中的对象按照什么样的顺序排列,要求添加到树集中的节点对象必须实现Comparable接口类的实例,也就是实现Comparable接口类所创建的对象。假如我们有4个学生对象,他们有姓名和成绩,我们想把这4个对象添加到树集中,并按照成绩的高低排列,而不是按照姓名的字典序排列节点,92,骄阳书苑,7.7 TreeSet泛型类,首先创建学生的Student类实现接口Comparable。Com
49、parable接口有一个方法: public int compareTo(Object b); Student类通过实现这个接口来规定它创建的对象的大小关系,如下所示,93,骄阳书苑,7.7 TreeSet泛型类,class Student implement Comparable int english=0; String name; Student(int e,String n) english=e;name=n; public int compareTo(Object b) Student st=(Student) b; return (this.english-st.english);
50、,94,骄阳书苑,7.7 TreeSet泛型类,Java规定:当pareTo(b)=0时,两者相等; pareTo(b)0时,称a大于b;pareTo(b)0时,称a小于b,95,骄阳书苑,7.7 TreeSet泛型类,当mytree每次添加对象时,都会调用接口中的方法实现对象大小的互相比较,但mytree调用接口方法的过程编程人员是不可见的。Sun公司在编写开发TreeSet类时已经实现了这一机制,96,骄阳书苑,例7-13:把Student对象添加到树集中,并按照成绩的高低排列,import java.util.*; class Student implements Comparable
51、int english=0; String name; Student(int e,String n) english=e;name=n; public int compareTo(Object b) Student st=(Student)b; return (this.english-st.english);,97,骄阳书苑,例7-13:把Student对象添加到树集中,并按照成绩的高低排列,public class Example7_13 public static void main(String args) TreeSet mytree=new TreeSet(); Student
52、st1,st2,st3; st1=new Student(90,zhan ying); st2=new Student(66,wang heng); st3=new Student(86,Liuh qing); mytree.add(st1); mytree.add(st2); mytree.add(st3,98,骄阳书苑,例7-13:把Student对象添加到树集中,并按照成绩的高低排列,Iterator te=mytree.iterator(); while(te.hasNext() Student stu=te.next(); System.out.println( ++
53、 +stu.english);,99,骄阳书苑,7.7 TreeSet泛型类,注:树集中不允许出现大小相等的两个节点。例如,在上述例子中如果再添加语句: st4=new Student(90,”Zhang ying”); mytree.add(st4); 是无效的。如果允许成绩相同,可把上述例子中Student类中的compareTo方法更改为,100,骄阳书苑,7.7 TreeSet泛型类,public int compareTo(Object b) Student st=(Student) b; if (this.english-st.english)=0) return 1; else
54、return (this.english-st.english),101,骄阳书苑,7.8 TreeMap泛型类,TreeMap类实现了Map接口。TreeMap提供了按排序顺序存储关键字/值对的有效手段。应该注意的是,不像散列映射(HashMap),树映射(TreeMap)保证它的元素按照关键字升序排列。下面是TreeMap的构造函数: TreeMap() TreeMap(Comparator comp,102,骄阳书苑,7.8 TreeMap泛型类,第一种形式构造的树映射,按关键字的大小顺序来排序树映射中的键/值对,关键字的大小顺序是按其字符串表示的字典顺序。第二种形式构造的树映射,关键字
55、的大小顺序按Comparator接口规定的大小顺序,树映射按关键字的大小顺序来排序树映射中的关键字/值对。 TreeMap类的常用方法与HashMap类相似,103,骄阳书苑,例7-14:使用TreeMap,分别按照学生的身高和体重排序对象,import java.util.*; class MyKey implements Comparable int number=0; MyKey(int number) this.number=number; public int compareTo(Object b) MyKey st=(MyKey)b; if(this.number-st.numbe
56、r)=0) return -1; else return (this.number-st.number);,104,骄阳书苑,例7-14:使用TreeMap,分别按照学生的身高和体重排序对象,class Student String name=null; int height,weight; Student(int w,int h,String name) weight=w; height=h; =name;,105,骄阳书苑,例7-14:使用TreeMap,分别按照学生的身高和体重排序对象,public class Example7_14 public static void main(String args ) Student s1=new Student(65,177,“张三), s2=new Student(85,168,“李四); TreeMap treemap=new T
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年工程承接权变更合同
- GB/T 44823-2024绿色矿山评价通则
- 数字货币设备行业前景展望
- 2024年ICU专用末端装置项目资金筹措计划书代可行性研究报告
- 强化管理-切实加强学校党建工作
- 2024年水利设施开发管理服务项目资金筹措计划书代可行性研究报告
- 预制菜分类原则(征求意见稿)
- 社区工作计划
- 小学语文老师工作总结个人工作总结7篇
- 幼儿园儿童节活动计划(33篇)
- 2024广东省云浮市郁南县财政局工程造价类专业人员招聘4人高频难、易错点500题模拟试题附带答案详解
- 军队文职考试《公共科目》试题及答案指导(2024年)
- 山东省青岛市2023-2024学年七年级上学期期末考试数学试题(含答案)
- 2024下半年江苏苏州城市学院招聘管理岗位工作人员27人历年高频难、易错点500题模拟试题附带答案详解
- 小学心理健康课教案分享-《身体“红绿灯”》
- 2022年信息科技课程新课标义务教育信息科技课程标准2022版解读课件
- 小学生防火安全教育课件
- 口语交际:商量(教学设计)2023-2024学年统编版语文二年级上册
- 乡土嵌合:农村社会工作的实践面向与行动路径
- 2023年中国铁路国际有限公司招聘考试试题及答案
- 2024年大学生信息素养大赛(省赛)考试题库(含答案)
评论
0/150
提交评论