遍历
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()的代码如下:
- Iterator<K> descendingKeyIterator() {
- return new DescendingKeyIterator(getLastEntry());
- }
说明:从中我们可以看出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. }