2 public class TreeSetDemo {
3 public static void main(String[] args) {
4 Set treeSet = new TreeSet();
5 //以无序的方式向treeSet里插入了若干对象
6 treeSet.add(“4”);
7 treeSet.add(“3”);
8 treeSet.add(“1”);
9 treeSet.add(“2”);
10 //treeSet.add(null); //会有运行期异常
11 //通过迭代器来遍历
12 Iterator setStringIt = treeSet.iterator();
13 while(setStringIt.hasNext()) {
14 System.out.print(setStringIt.next() + " ");
15 }
16 }
17 }
在第4行,我们以泛型的方式创建了一个TreeSet,并从第6到第9行,以无序的方式插入了4个String对象。特别注意,TreeSet不允许插入null值,所以运行第10行的代码时会有异常。
当我们在第14行通过迭代器遍历这个treeSet对象时,会发现输出的次序和插入次序不一致,而且数据已经被排序,结果如下。
1 2 3 4
如果TreeSet里存储的不是上例中的基本数据类型,而是自定义的class,那么这个类必须实现Comparable接口里的compareTo方法,TreeSet会根据compareTo里的定义来区分谁大谁小,最终确定TreeSet里的次序。
我们可以在compareTo方法里定义排序依据。在上文3.2.3部分的compareTo方法里,我们是拿学生的id来作为判断依据,如果两个学生的id相等,那么这个方法的返回值是0,说明这两个学生是相等的(是同一个学生)。此外,该方法还可以返回1或-1,其中1表示大于,-1表示小于。
我们来通过SortedStudent.java这个例子来看TreeSet是如何对自定义类进行排序的。
1 //省略import迭代器和集合类支持包的代码
2 class SortedStudent implements Comparable{
3 private int id;
4 public SortedStudent(int id)
5 {this.id = id;}
6 public int getId()
7 {return id;}
8 //重写equals方法
9 public boolean equals(SortedStudent stu)
10 {
11 if( stu.getId() == this.id )
12 { return true; }
13 else{ return false; }
14 }
15 //根据id的大小来作为排序依据
16 public int compareTo(Object obj) {
17 // 判断是否是学生类型
18 if (obj instanceof SortedStudent) {
19 SortedStudent s = (SortedStudent) obj;
20 // 如果是学生类型,如果学号相等,则不加入Set
21 if (s.getId() == this.getId())
22 { return 0; }
23 else {
24 return s.getId()>this.getId()?1:-1;
25 }
26 // 不是学生类型对象的话就不要加入它
27 } else { return 0; }
28 }
29 }
30 public class SortStudentByID {
31 public static void main(String[] args) {
32 SortedStudent s1 = new SortedStudent(1);
33 SortedStudent s2 = new SortedStudent(2);
34 SortedStudent s3 = new SortedStudent(3);
35 SortedStudent s4 = new SortedStudent(4);
36 Set stuSet = new TreeSet();
37 //这里故意用不排序的方式放入TreeSet
38 stuSet.add(s2);
39 stuSet.add(s4);
40 stuSet.add(s1);
41 stuSet.add(s3);
42 //通过迭代器来遍历这个TreeSet对象
43 Iterator itStu = stuSet.iterator();
44 while(itStu.hasNext()){
45 //能看到有序输出,输出结果是4,3,2,1
46 System.out.println(itStu.next().getId());
47 }
48
49 }
50 }
在第2行的定义SortedStudent类的代码里,我们实现了Compareable接口。在第16行里,我们重写了compareTo方法,在这个方法里,如果两个学生对象的id相等,则认为它们相等,否则将用id的大小来判断谁大谁小。
在38到41里,虽然我们用乱序的方式放入了4个学生对象,但TreeSet会自动地对它们进行排序,这点可以从第46行的输出结果里得到验证。
关于集合类的面试文章汇总:
言尽于此,完结
无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。
- 第一,设计模式能让专业人之间交流方便,如下:
程序员A:这里我用了XXX设计模式
程序员B:那我大致了解你程序的设计思路了
- 第二,易维护
项目经理:今天客户有这样一个需求…
程序员:明白了,这里我使用了XXX设计模式,所以改起来很快
- 第三,设计模式是编程经验的总结
程序员A:B,你怎么想到要这样去构建你的代码
程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题
- 第四,学习设计模式并不是必须的
程序员A:B,你这段代码使用的是XXX设计模式对吗?
程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的
从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!
搜集费时费力,能看到此处的都是真爱!
写的
[外链图片转存中…(img-TPFBF7e7-1714395611995)]
从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!
[外链图片转存中…(img-WVGoslV0-1714395611995)]
搜集费时费力,能看到此处的都是真爱!