TreeMap源码分析十

转自:http://www.fengfly.com/plus/view-213898-11.html

遍历


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.     }  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值