码迷,mamicode.com
首页 > 编程语言 > 详细

Java基础知识强化之集合框架笔记43:Set集合之TreeSet存储Integer类型的元素并遍历

时间:2015-10-06 20:39:25      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:

1. TreeSet类概述:

 能够对元素按照某种规则进行排序。

或者根据创建set时提供的Comparator进行排序

具体取决于使用的构造方法

 

2. 代码示例:

 1 package cn.itcast_05;
 2 
 3 import java.util.TreeSet;
 4 
 5 /*
 6  * TreeSet:能够对元素按照某种规则进行排序。
 7  * 排序有两种方式
 8  * A:自然排序
 9  * B:比较器排序
10  * 
11  * TreeSet集合的特点:排序和唯一
12  * 
13  * 通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法14  */
15 public class TreeSetDemo {
16     public static void main(String[] args) {
17         // 创建集合对象
18         // 自然顺序进行排序
19         TreeSet<Integer> ts = new TreeSet<Integer>();
20 
21         // 创建元素并添加
22         // 20,18,23,22,17,24,19,18,24
23         ts.add(20);
24         ts.add(18);
25         ts.add(23);
26         ts.add(22);
27         ts.add(17);
28         ts.add(24);
29         ts.add(19);
30         ts.add(18);
31         ts.add(24);
32 
33         // 遍历
34         for (Integer i : ts) {
35             System.out.println(i);
36         }
37     }
38 }

运行效果,如下:

技术分享

 

 

3.  TreeSe保证元素排序的源码解析

通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法。

 1 interface Collection {...}
 2 
 3 interface Set extends Collection {...}
 4 
 5 interface NavigableMap {
 6 
 7 }
 8 
 9 class TreeMap implements NavigableMap {
10      public V put(K key, V value) {
11         Entry<K,V> t = root;
12         if (t == null) {
13             compare(key, key); // type (and possibly null) check
14 
15             root = new Entry<>(key, value, null);
16             size = 1;
17             modCount++;
18             return null;
19         }
20         int cmp;
21         Entry<K,V> parent;
22         // split comparator and comparable paths
23         Comparator<? super K> cpr = comparator;
24         if (cpr != null) {
25             do {
26                 parent = t;
27                 cmp = cpr.compare(key, t.key);
28                 if (cmp < 0)
29                     t = t.left;
30                 else if (cmp > 0)
31                     t = t.right;
32                 else
33                     return t.setValue(value);
34             } while (t != null);
35         }
36         else {
37             if (key == null)
38                 throw new NullPointerException();
39             Comparable<? super K> k = (Comparable<? super K>) key;
40             do {
41                 parent = t;
42                 cmp = k.compareTo(t.key);
43                 if (cmp < 0)
44                     t = t.left;
45                 else if (cmp > 0)
46                     t = t.right;
47                 else
48                     return t.setValue(value);
49             } while (t != null);
50         }
51         Entry<K,V> e = new Entry<>(key, value, parent);
52         if (cmp < 0)
53             parent.left = e;
54         else
55             parent.right = e;
56         fixAfterInsertion(e);
57         size++;
58         modCount++;
59         return null;
60     }
61 }
62 
63 class TreeSet implements Set {
64     private transient NavigableMap<E,Object> m;
65     
66     public TreeSet() {
67          this(new TreeMap<E,Object>());
68     }
69 
70     public boolean add(E e) {
71         return m.put(e, PRESENT)==null;
72     }
73 }

  真正的比较是依赖于元素的compareTo()方法,而这个方法是定义在 Comparable里面的。所以,你要想重写该方法,就必须是先 Comparable接口。这个接口表示的就是自然排序。

Java基础知识强化之集合框架笔记43:Set集合之TreeSet存储Integer类型的元素并遍历

标签:

原文地址:http://www.cnblogs.com/hebao0514/p/4857605.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!