博学谷——让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