第7章 集合类_补充案例

博学谷——让IT教学更简单,让IT学习更有效

图7-13 HashSet对象存储过程

案例7-11 TreeSet集合的存储

一、案例描述

1、 考核知识点

编号:00107012 名称:TreeSet集合

2、 练习目标

? 了解TreeSet集合的存储特点

? 掌握TreeSet集合的存储和迭代操作

3、 需求分析

TreeSet是Set接口的另一个实现类,它内部采用平衡二叉树来存储元素,这样的结构可以保证TreeSet集合中没有重复的元素,并且可以对元素进行排序。为了让初学者能熟悉TreeSet集合的使用,本案例通过向TreeSet集合添加元素并遍历集合元素来演示。

4、 设计思路(实现原理)

1) 编写一个类Example11,定义一个TreeSet集合

2) 向TreeSet集合中添加一系列元素,其中有重复元素 3) 遍历输出TreeSet集合中所有的元素

二、案例实现

import java.util.*; public class Example11 {

public static void main(String[] args) {

17

博学谷——让IT教学更简单,让IT学习更有效

} }

TreeSet ts = new TreeSet(); //创建TreeSet集合 ts.add(\ ts.add(\ts.add(\ts.add(\ts.add(\ts.add(\

Iterator it = ts.iterator(); while (it.hasNext()) { }

//使用Iterator迭代器遍历TreeSet集合元素

System.out.println(it.next());

//向集合中添加一系列元素,其中包括重复元素

运行结果如图7-14所示。

图7-14 运行结果

三、案例总结

TreeSet内部采用平衡二叉树来存储元素,所谓二叉树就是说每个节点最多有两个子节点的有序树,每

个节点及其子节点组成的树称为子树,通常左侧的子节点称为“左子树”,右侧的节点称为“右子树”,其中左子树上的元素应小于它的根结点,而右子树上的元素应大于它的根结点。二叉树中元素的存储结构如图7-15所示。

元素元素元素元素元素元素元素 图7-15 二叉树的存储结构

案例7-12 自定义比较器

一、案例描述

1、 考核知识点

编号:00107013

18

博学谷——让IT教学更简单,让IT学习更有效

名称:Comparator比较器

2、 练习目标

? 掌握如何通过自定义比较器的方式对TreeSet集合中的元素排序

3、 需求分析

如果定义的类没有实现Comparable接口或者对于实现了Comparable接口的类而不想按照定义的compareTo()方法进行排序,这时,可以通过自定义比较器的方式对TreeSet集合中的元素排序。为了让初学者能掌握自定义比较器的编写,本案例将通过自定义比较器对TreeSet集合中的元素排序。

4、 设计思路(实现原理)

1) 设计类Person,该类中有变量name和age,并实现它们的get()和set()方法。 2) 设计类MyComparator自定义比较器,该类实现了Comparator接口

3) 在类MyComparator中实现比较方法,以Person对象中age为主要比较条件,如果age相等

再比较name

4) 编写类Example12,创建TreeSet集合,在创建TreeSet集合时传入自定义比较器

MyComparator。并将Person对象存入集合中 5) 遍历集合中的元素,观察执行结果

二、案例实现

改写Person类,具体代码如下:

class Person {

private String name; private int age;

public Person(String name,int age) { this.name = name; this.age = age;

}

public String toString(){

return \ }

public String getName() {

return name; }

public void setName(String name) {

this.name = name; }

public int getAge() {

return age; }

public void setAge(int age) { }

this.age = age; }

自定义比较器,具体代码如下:

19

博学谷——让IT教学更简单,让IT学习更有效

class MyComparator implements Comparator { }

public int compare(Object o1, Object o2) { }

// 类型转换,比较的是Person对象 Person p1 = (Person) o1; Person p2 = (Person) o2; // 以年龄为主要条件

int num = p1.getAge() - p2.getAge();

return num == 0 ? p1.getName().compareTo(p2.getName()) : num;

编写Example12类,具体代码如下:

import java.util.TreeSet; import java.util.Iterator; import java.util.Comparator; public class Example12 { }

public static void main(String[] args) { }

TreeSet ts = new TreeSet(new MyComparator()); ts.add(new Person(\ts.add(new Person(\ts.add(new Person(\ts.add(new Person(\ts.add(new Person(\ts.add(new Person(\Iterator it = ts.iterator(); while (it.hasNext()) { }

System.out.println(it.next());

运行结果如图7-16所示。

图7-16 运行结果

三、案例总结

在本案例中,定义了一个MyComparator类实现了Comparator接口,在compare()方法中实现元素的比较,这就相当于定义了一个比较器。在创建TreeSet集合时,将MyComparator比较器对象传入,当向集合中添加元素时,比较器对象的compare()方法就会被自动调用,从而使存入TreeSet集合中的字符串按照长度进行排序。

20

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4