遍历


TreeMap的顺序遍历和逆序遍历原理非常简单。
由于TreeMap中的元素是从小到大的顺序排列的。因此,顺序遍历,就是从第一个元素开始,逐个向后遍历;而倒序遍历则恰恰相反,它是从最后一个元素开始,逐个往前遍历。

我们可以通过 keyIterator() 和 descendingKeyIterator()来说明!
keyIterator()的作用是返回顺序的KEY的集合,
descendingKeyIterator()的作用是返回逆序的KEY的集合。

keyIterator() 的代码如下:

1. Iterator<K> keyIterator() {  
2.     return new KeyIterator(getFirstEntry());  
3. }


说明:从中我们可以看出keyIterator() 是返回以“第一个节点(getFirstEntry)” 为其实元素的迭代器。
KeyIterator的代码如下:

1. final class KeyIterator extends PrivateEntryIterator<K> {  
2.     KeyIterator(Entry<K,V> first) {  
3.         super(first);  
4.     }  
5.     public K next() {  
6.         return nextEntry().key;  
7.     }  
8. }

说明:KeyIterator继承于PrivateEntryIterator。当我们通过next()不断获取下一个元素的时候,就是执行的顺序遍历了。

descendingKeyIterator()的代码如下:


  1. Iterator<K> descendingKeyIterator() {  
  2.     return new DescendingKeyIterator(getLastEntry());  
  3. }  


说明:从中我们可以看出descendingKeyIterator() 是返回以“最后一个节点(getLastEntry)” 为其实元素的迭代器。
再看看DescendingKeyIterator的代码:


1. final class DescendingKeyIterator extends PrivateEntryIterator<K> {  
2.     DescendingKeyIterator(Entry<K,V> first) {  
3.         super(first);  
4.     }  
5.     public K next() {  
6.         return prevEntry().key;  
7.     }  
8. }


说明:DescendingKeyIterator继承于PrivateEntryIterator。当我们通过next()不断获取下一个元素的时候,实际上调用的是prevEntry()获取的上一个节点,这样它实际上执行的是逆序遍历了。



 遍历TreeMap的键值对

第一步:根据entrySet()获取TreeMap的“键值对”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

1. // 假设map是TreeMap对象  
2. // map中的key是String类型,value是Integer类型  
3. Integer integ = null;  
4. Iterator iter = map.entrySet().iterator();  
5. while(iter.hasNext()) {  
6.     Map.Entry entry = (Map.Entry)iter.next();  
7.     // 获取key  
8.     key = (String)entry.getKey();  
9.         // 获取value  
10.     integ = (Integer)entry.getValue();  
11. }


3.2 遍历TreeMap的键

第一步:根据keySet()获取TreeMap的“键”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

1. // 假设map是TreeMap对象  
2. // map中的key是String类型,value是Integer类型  
3. String key = null;  
4. Integer integ = null;  
5. Iterator iter = map.keySet().iterator();  
6. while (iter.hasNext()) {  
7.         // 获取key  
8.     key = (String)iter.next();  
9.         // 根据key,获取value  
10.     integ = (Integer)map.get(key);  
11. }

3.3 遍历TreeMap的值

第一步:根据value()获取TreeMap的“值”的集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。


    1. // 假设map是TreeMap对象  
    2. // map中的key是String类型,value是Integer类型  
    3. Integer value = null;  
    4. Collection c = map.values();  
    5. Iterator iter= c.iterator();  
    6. while (iter.hasNext()) {  
    7.     value = (Integer)iter.next();  
    8. }


    TreeMap遍历测试程序如下:

    1. import java.util.Map;  
    2. import java.util.Random;  
    3. import java.util.Iterator;  
    4. import java.util.TreeMap;  
    5. import java.util.HashSet;  
    6. import java.util.Map.Entry;  
    7. import java.util.Collection;  
    8.  
    9. /* 
    10.  * @desc 遍历TreeMap的测试程序。 
    11.  *   (01) 通过entrySet()去遍历key、value,参考实现函数: 
    12.  *        iteratorTreeMapByEntryset() 
    13.  *   (02) 通过keySet()去遍历key、value,参考实现函数: 
    14.  *        iteratorTreeMapByKeyset() 
    15.  *   (03) 通过values()去遍历value,参考实现函数: 
    16.  *        iteratorTreeMapJustValues() 
    17.  * 
    18.  * @author skywang 
    19.  */ 
    20. public class TreeMapIteratorTest {  
    21.  
    22.     public static void main(String[] args) {  
    23.         int val = 0;  
    24.         String key = null;  
    25.         Integer value = null;  
    26.         Random r = new Random();  
    27.         TreeMap map = new TreeMap();  
    28.  
    29.         for (int i=0; i<12; i++) {  
    30.             // 随机获取一个[0,100)之间的数字  
    31.             val = r.nextInt(100);  
    32.               
    33.             key = String.valueOf(val);  
    34.             value = r.nextInt(5);  
    35.             // 添加到TreeMap中  
    36.             map.put(key, value);  
    37.             System.out.println(" key:"+key+" value:"+value);  
    38.         }  
    39.         // 通过entrySet()遍历TreeMap的key-value  
    40.         iteratorTreeMapByEntryset(map) ;  
    41.           
    42.         // 通过keySet()遍历TreeMap的key-value  
    43.         iteratorTreeMapByKeyset(map) ;  
    44.           
    45.         // 单单遍历TreeMap的value  
    46.         iteratorTreeMapJustValues(map);          
    47.     }  
    48.       
    49.     /* 
    50.      * 通过entry set遍历TreeMap 
    51.      * 效率高! 
    52.      */ 
    53.     private static void iteratorTreeMapByEntryset(TreeMap map) {  
    54.         if (map == null)  
    55.             return ;  
    56.  
    57.         System.out.println("\niterator TreeMap By entryset");  
    58.         String key = null;  
    59.         Integer integ = null;  
    60.         Iterator iter = map.entrySet().iterator();  
    61.         while(iter.hasNext()) {  
    62.             Map.Entry entry = (Map.Entry)iter.next();  
    63.               
    64.             key = (String)entry.getKey();  
    65.             integ = (Integer)entry.getValue();  
    66.             System.out.println(key+" -- "+integ.intValue());  
    67.         }  
    68.     }  
    69.  
    70.     /* 
    71.      * 通过keyset来遍历TreeMap 
    72.      * 效率低! 
    73.      */ 
    74.     private static void iteratorTreeMapByKeyset(TreeMap map) {  
    75.         if (map == null)  
    76.             return ;  
    77.  
    78.         System.out.println("\niterator TreeMap By keyset");  
    79.         String key = null;  
    80.         Integer integ = null;  
    81.         Iterator iter = map.keySet().iterator();  
    82.         while (iter.hasNext()) {  
    83.             key = (String)iter.next();  
    84.             integ = (Integer)map.get(key);  
    85.             System.out.println(key+" -- "+integ.intValue());  
    86.         }  
    87.     }  
    88.       
    89.  
    90.     /* 
    91.      * 遍历TreeMap的values 
    92.      */ 
    93.     private static void iteratorTreeMapJustValues(TreeMap map) {  
    94.         if (map == null)  
    95.             return ;  
    96.           
    97.         Collection c = map.values();  
    98.         Iterator iter= c.iterator();  
    99.         while (iter.hasNext()) {  
    100.             System.out.println(iter.next());  
    101.        }  
    102.     }  
    103. }