转自:http://www.fengfly.com/plus/view-213898-11.html
遍历
TreeMap的顺序遍历和逆序遍历原理非常简单。
由于TreeMap中的元素是从小到大的顺序排列的。因此,顺序遍历,就是从第一个元素开始,逐个向后遍历;而倒序遍历则恰恰相反,它是从最后一个元素开始,逐个往前遍历。
我们可以通过 keyIterator() 和 descendingKeyIterator()来说明!
keyIterator()的作用是返回顺序的KEY的集合,
descendingKeyIterator()的作用是返回逆序的KEY的集合。
keyIterator() 的代码如下:
- Iterator<K> keyIterator() {
- return new KeyIterator(getFirstEntry());
- }
说明:从中我们可以看出keyIterator() 是返回以“第一个节点(getFirstEntry)” 为其实元素的迭代器。
KeyIterator的代码如下:
- final class KeyIterator extends PrivateEntryIterator<K> {
- KeyIterator(Entry<K,V> first) {
- super(first);
- }
- public K next() {
- return nextEntry().key;
- }
- }
说明:KeyIterator继承于PrivateEntryIterator。当我们通过next()不断获取下一个元素的时候,就是执行的顺序遍历了。
descendingKeyIterator()的代码如下:
- Iterator<K> descendingKeyIterator() {
- return new DescendingKeyIterator(getLastEntry());
- }
说明:从中我们可以看出descendingKeyIterator() 是返回以“最后一个节点(getLastEntry)” 为其实元素的迭代器。
再看看DescendingKeyIterator的代码:
- final class DescendingKeyIterator extends PrivateEntryIterator<K> {
- DescendingKeyIterator(Entry<K,V> first) {
- super(first);
- }
- public K next() {
- return prevEntry().key;
- }
- }
说明:DescendingKeyIterator继承于PrivateEntryIterator。当我们通过next()不断获取下一个元素的时候,实际上调用的是prevEntry()获取的上一个节点,这样它实际上执行的是逆序遍历了。
遍历TreeMap的键值对
第一步:根据entrySet()获取TreeMap的“键值对”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。
- // 假设map是TreeMap对象
- // map中的key是String类型,value是Integer类型
- Integer integ = null;
- Iterator iter = map.entrySet().iterator();
- while(iter.hasNext()) {
- Map.Entry entry = (Map.Entry)iter.next();
- // 获取key
- key = (String)entry.getKey();
- // 获取value
- integ = (Integer)entry.getValue();
- }
3.2 遍历TreeMap的键
第一步:根据keySet()获取TreeMap的“键”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。
- // 假设map是TreeMap对象
- // map中的key是String类型,value是Integer类型
- String key = null;
- Integer integ = null;
- Iterator iter = map.keySet().iterator();
- while (iter.hasNext()) {
- // 获取key
- key = (String)iter.next();
- // 根据key,获取value
- integ = (Integer)map.get(key);
- }
3.3 遍历TreeMap的值
第一步:根据value()获取TreeMap的“值”的集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。
- // 假设map是TreeMap对象
- // map中的key是String类型,value是Integer类型
- Integer value = null;
- Collection c = map.values();
- Iterator iter= c.iterator();
- while (iter.hasNext()) {
- value = (Integer)iter.next();
- }
TreeMap遍历测试程序如下:
- import java.util.Map;
- import java.util.Random;
- import java.util.Iterator;
- import java.util.TreeMap;
- import java.util.HashSet;
- import java.util.Map.Entry;
- import java.util.Collection;
- /*
- * @desc 遍历TreeMap的测试程序。
- * (01) 通过entrySet()去遍历key、value,参考实现函数:
- * iteratorTreeMapByEntryset()
- * (02) 通过keySet()去遍历key、value,参考实现函数:
- * iteratorTreeMapByKeyset()
- * (03) 通过values()去遍历value,参考实现函数:
- * iteratorTreeMapJustValues()
- *
- * @author skywang
- */
- public class TreeMapIteratorTest {
- public static void main(String[] args) {
- int val = 0;
- String key = null;
- Integer value = null;
- Random r = new Random();
- TreeMap map = new TreeMap();
- for (int i=0; i<12; i++) {
- // 随机获取一个[0,100)之间的数字
- val = r.nextInt(100);
- key = String.valueOf(val);
- value = r.nextInt(5);
- // 添加到TreeMap中
- map.put(key, value);
- System.out.println(" key:"+key+" value:"+value);
- }
- // 通过entrySet()遍历TreeMap的key-value
- iteratorTreeMapByEntryset(map) ;
- // 通过keySet()遍历TreeMap的key-value
- iteratorTreeMapByKeyset(map) ;
- // 单单遍历TreeMap的value
- iteratorTreeMapJustValues(map);
- }
- /*
- * 通过entry set遍历TreeMap
- * 效率高!
- */
- private static void iteratorTreeMapByEntryset(TreeMap map) {
- if (map == null)
- return ;
- System.out.println("\niterator TreeMap By entryset");
- String key = null;
- Integer integ = null;
- Iterator iter = map.entrySet().iterator();
- while(iter.hasNext()) {
- Map.Entry entry = (Map.Entry)iter.next();
- key = (String)entry.getKey();
- integ = (Integer)entry.getValue();
- System.out.println(key+" -- "+integ.intValue());
- }
- }
- /*
- * 通过keyset来遍历TreeMap
- * 效率低!
- */
- private static void iteratorTreeMapByKeyset(TreeMap map) {
- if (map == null)
- return ;
- System.out.println("\niterator TreeMap By keyset");
- String key = null;
- Integer integ = null;
- Iterator iter = map.keySet().iterator();
- while (iter.hasNext()) {
- key = (String)iter.next();
- integ = (Integer)map.get(key);
- System.out.println(key+" -- "+integ.intValue());
- }
- }
- /*
- * 遍历TreeMap的values
- */
- private static void iteratorTreeMapJustValues(TreeMap map) {
- if (map == null)
- return ;
- Collection c = map.values();
- Iterator iter= c.iterator();
- while (iter.hasNext()) {
- System.out.println(iter.next());
- }
- }
- }