ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/main/java/util/TreeMap.java
Revision: 1.2
Committed: Fri Dec 31 13:00:33 2004 UTC (19 years, 4 months ago) by dl
Branch: MAIN
Changes since 1.1: +14 -64 lines
Log Message:
Add AbstractMap.SimpleImmutableEntry; make SimpleEntry public

File Contents

# User Rev Content
1 dl 1.1 /*
2     * %W% %E%
3     *
4     * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
5     * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
6     */
7    
8     package java.util;
9    
10    
11     /**
12     * Red-Black tree based implementation of the <tt>NavigableMap</tt> interface.
13     * This class guarantees that the map will be in ascending key order, sorted
14     * according to the <i>natural order</i> for the key's class (see
15     * <tt>Comparable</tt>), or by the comparator provided at creation time,
16     * depending on which constructor is used.<p>
17     *
18     * This implementation provides guaranteed log(n) time cost for the
19     * <tt>containsKey</tt>, <tt>get</tt>, <tt>put</tt> and <tt>remove</tt>
20     * operations. Algorithms are adaptations of those in Cormen, Leiserson, and
21     * Rivest's <I>Introduction to Algorithms</I>.<p>
22     *
23     * Note that the ordering maintained by a sorted map (whether or not an
24     * explicit comparator is provided) must be <i>consistent with equals</i> if
25     * this sorted map is to correctly implement the <tt>Map</tt> interface. (See
26     * <tt>Comparable</tt> or <tt>Comparator</tt> for a precise definition of
27     * <i>consistent with equals</i>.) This is so because the <tt>Map</tt>
28     * interface is defined in terms of the equals operation, but a map performs
29     * all key comparisons using its <tt>compareTo</tt> (or <tt>compare</tt>)
30     * method, so two keys that are deemed equal by this method are, from the
31     * standpoint of the sorted map, equal. The behavior of a sorted map
32     * <i>is</i> well-defined even if its ordering is inconsistent with equals; it
33     * just fails to obey the general contract of the <tt>Map</tt> interface.<p>
34     *
35     * <b>Note that this implementation is not synchronized.</b> If multiple
36     * threads access a map concurrently, and at least one of the threads modifies
37     * the map structurally, it <i>must</i> be synchronized externally. (A
38     * structural modification is any operation that adds or deletes one or more
39     * mappings; merely changing the value associated with an existing key is not
40     * a structural modification.) This is typically accomplished by
41     * synchronizing on some object that naturally encapsulates the map. If no
42     * such object exists, the map should be "wrapped" using the
43     * <tt>Collections.synchronizedMap</tt> method. This is best done at creation
44     * time, to prevent accidental unsynchronized access to the map:
45     * <pre>
46     * Map m = Collections.synchronizedMap(new TreeMap(...));
47     * </pre><p>
48     *
49     * The iterators returned by all of this class's "collection view methods" are
50     * <i>fail-fast</i>: if the map is structurally modified at any time after the
51     * iterator is created, in any way except through the iterator's own
52     * <tt>remove</tt> or <tt>add</tt> methods, the iterator throws a
53     * <tt>ConcurrentModificationException</tt>. Thus, in the face of concurrent
54     * modification, the iterator fails quickly and cleanly, rather than risking
55     * arbitrary, non-deterministic behavior at an undetermined time in the
56     * future.
57     *
58     * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
59     * as it is, generally speaking, impossible to make any hard guarantees in the
60     * presence of unsynchronized concurrent modification. Fail-fast iterators
61     * throw <tt>ConcurrentModificationException</tt> on a best-effort basis.
62     * Therefore, it would be wrong to write a program that depended on this
63     * exception for its correctness: <i>the fail-fast behavior of iterators
64     * should be used only to detect bugs.</i><p>
65     *
66     * <p>All <tt>Map.Entry</tt> pairs returned by methods in this class
67     * and its views represent snapshots of mappings at the time they were
68     * produced. They do <em>not</em> support the <tt>Entry.setValue</tt>
69     * method. (Note however that it is possible to change mappings in the
70     * associated map using <tt>put</tt>.)
71     *
72     * <p>This class is a member of the
73     * <a href="{@docRoot}/../guide/collections/index.html">
74     * Java Collections Framework</a>.
75     *
76     * @author Josh Bloch and Doug Lea
77     * @version %I%, %G%
78     * @see Map
79     * @see HashMap
80     * @see Hashtable
81     * @see Comparable
82     * @see Comparator
83     * @see Collection
84     * @see Collections#synchronizedMap(Map)
85     * @since 1.2
86     */
87    
88     public class TreeMap<K,V>
89     extends AbstractMap<K,V>
90     implements NavigableMap<K,V>, Cloneable, java.io.Serializable
91     {
92     /**
93     * The Comparator used to maintain order in this TreeMap, or
94     * null if this TreeMap uses its elements natural ordering.
95     *
96     * @serial
97     */
98     private Comparator<? super K> comparator = null;
99    
100     private transient Entry<K,V> root = null;
101    
102     /**
103     * The number of entries in the tree
104     */
105     private transient int size = 0;
106    
107     /**
108     * The number of structural modifications to the tree.
109     */
110     private transient int modCount = 0;
111    
112     private void incrementSize() { modCount++; size++; }
113     private void decrementSize() { modCount++; size--; }
114    
115     /**
116     * Constructs a new, empty map, sorted according to the keys' natural
117     * order. All keys inserted into the map must implement the
118     * <tt>Comparable</tt> interface. Furthermore, all such keys must be
119     * <i>mutually comparable</i>: <tt>k1.compareTo(k2)</tt> must not throw a
120     * ClassCastException for any elements <tt>k1</tt> and <tt>k2</tt> in the
121     * map. If the user attempts to put a key into the map that violates this
122     * constraint (for example, the user attempts to put a string key into a
123     * map whose keys are integers), the <tt>put(Object key, Object
124     * value)</tt> call will throw a <tt>ClassCastException</tt>.
125     *
126     * @see Comparable
127     */
128     public TreeMap() {
129     }
130    
131     /**
132     * Constructs a new, empty map, sorted according to the given comparator.
133     * All keys inserted into the map must be <i>mutually comparable</i> by
134     * the given comparator: <tt>comparator.compare(k1, k2)</tt> must not
135     * throw a <tt>ClassCastException</tt> for any keys <tt>k1</tt> and
136     * <tt>k2</tt> in the map. If the user attempts to put a key into the
137     * map that violates this constraint, the <tt>put(Object key, Object
138     * value)</tt> call will throw a <tt>ClassCastException</tt>.
139     *
140     * @param c the comparator that will be used to sort this map. A
141     * <tt>null</tt> value indicates that the keys' <i>natural
142     * ordering</i> should be used.
143     */
144     public TreeMap(Comparator<? super K> c) {
145     this.comparator = c;
146     }
147    
148     /**
149     * Constructs a new map containing the same mappings as the given map,
150     * sorted according to the keys' <i>natural order</i>. All keys inserted
151     * into the new map must implement the <tt>Comparable</tt> interface.
152     * Furthermore, all such keys must be <i>mutually comparable</i>:
153     * <tt>k1.compareTo(k2)</tt> must not throw a <tt>ClassCastException</tt>
154     * for any elements <tt>k1</tt> and <tt>k2</tt> in the map. This method
155     * runs in n*log(n) time.
156     *
157     * @param m the map whose mappings are to be placed in this map.
158     * @throws ClassCastException the keys in t are not Comparable, or
159     * are not mutually comparable.
160     * @throws NullPointerException if the specified map is null.
161     */
162     public TreeMap(Map<? extends K, ? extends V> m) {
163     putAll(m);
164     }
165    
166     /**
167     * Constructs a new map containing the same mappings as the given
168     * <tt>SortedMap</tt>, sorted according to the same ordering. This method
169     * runs in linear time.
170     *
171     * @param m the sorted map whose mappings are to be placed in this map,
172     * and whose comparator is to be used to sort this map.
173     * @throws NullPointerException if the specified sorted map is null.
174     */
175     public TreeMap(SortedMap<K, ? extends V> m) {
176     comparator = m.comparator();
177     try {
178     buildFromSorted(m.size(), m.entrySet().iterator(), null, null);
179     } catch (java.io.IOException cannotHappen) {
180     } catch (ClassNotFoundException cannotHappen) {
181     }
182     }
183    
184    
185     // Query Operations
186    
187     /**
188     * Returns the number of key-value mappings in this map.
189     *
190     * @return the number of key-value mappings in this map.
191     */
192     public int size() {
193     return size;
194     }
195    
196     /**
197     * Returns <tt>true</tt> if this map contains a mapping for the specified
198     * key.
199     *
200     * @param key key whose presence in this map is to be tested.
201     *
202     * @return <tt>true</tt> if this map contains a mapping for the
203     * specified key.
204     * @throws ClassCastException if the key cannot be compared with the keys
205     * currently in the map.
206     * @throws NullPointerException key is <tt>null</tt> and this map uses
207     * natural ordering, or its comparator does not tolerate
208     * <tt>null</tt> keys.
209     */
210     public boolean containsKey(Object key) {
211     return getEntry(key) != null;
212     }
213    
214     /**
215     * Returns <tt>true</tt> if this map maps one or more keys to the
216     * specified value. More formally, returns <tt>true</tt> if and only if
217     * this map contains at least one mapping to a value <tt>v</tt> such
218     * that <tt>(value==null ? v==null : value.equals(v))</tt>. This
219     * operation will probably require time linear in the Map size for most
220     * implementations of Map.
221     *
222     * @param value value whose presence in this Map is to be tested.
223     * @return <tt>true</tt> if a mapping to <tt>value</tt> exists;
224     * <tt>false</tt> otherwise.
225     * @since 1.2
226     */
227     public boolean containsValue(Object value) {
228     return (root==null ? false :
229     (value==null ? valueSearchNull(root)
230     : valueSearchNonNull(root, value)));
231     }
232    
233     private boolean valueSearchNull(Entry n) {
234     if (n.value == null)
235     return true;
236    
237     // Check left and right subtrees for value
238     return (n.left != null && valueSearchNull(n.left)) ||
239     (n.right != null && valueSearchNull(n.right));
240     }
241    
242     private boolean valueSearchNonNull(Entry n, Object value) {
243     // Check this node for the value
244     if (value.equals(n.value))
245     return true;
246    
247     // Check left and right subtrees for value
248     return (n.left != null && valueSearchNonNull(n.left, value)) ||
249     (n.right != null && valueSearchNonNull(n.right, value));
250     }
251    
252     /**
253     * Returns the value to which this map maps the specified key. Returns
254     * <tt>null</tt> if the map contains no mapping for this key. A return
255     * value of <tt>null</tt> does not <i>necessarily</i> indicate that the
256     * map contains no mapping for the key; it's also possible that the map
257     * explicitly maps the key to <tt>null</tt>. The <tt>containsKey</tt>
258     * operation may be used to distinguish these two cases.
259     *
260     * @param key key whose associated value is to be returned.
261     * @return the value to which this map maps the specified key, or
262     * <tt>null</tt> if the map contains no mapping for the key.
263     * @throws ClassCastException key cannot be compared with the keys
264     * currently in the map.
265     * @throws NullPointerException key is <tt>null</tt> and this map uses
266     * natural ordering, or its comparator does not tolerate
267     * <tt>null</tt> keys.
268     *
269     * @see #containsKey(Object)
270     */
271     public V get(Object key) {
272     Entry<K,V> p = getEntry(key);
273     return (p==null ? null : p.value);
274     }
275    
276     /**
277     * Returns the comparator used to order this map, or <tt>null</tt> if this
278     * map uses its keys' natural order.
279     *
280     * @return the comparator associated with this sorted map, or
281     * <tt>null</tt> if it uses its keys' natural sort method.
282     */
283     public Comparator<? super K> comparator() {
284     return comparator;
285     }
286    
287     /**
288     * Returns the first (lowest) key currently in this sorted map.
289     *
290     * @return the first (lowest) key currently in this sorted map.
291     * @throws NoSuchElementException Map is empty.
292     */
293     public K firstKey() {
294     return key(getFirstEntry());
295     }
296    
297     /**
298     * Returns the last (highest) key currently in this sorted map.
299     *
300     * @return the last (highest) key currently in this sorted map.
301     * @throws NoSuchElementException Map is empty.
302     */
303     public K lastKey() {
304     return key(getLastEntry());
305     }
306    
307     /**
308     * Copies all of the mappings from the specified map to this map. These
309     * mappings replace any mappings that this map had for any of the keys
310     * currently in the specified map.
311     *
312     * @param map mappings to be stored in this map.
313     * @throws ClassCastException class of a key or value in the specified
314     * map prevents it from being stored in this map.
315     *
316     * @throws NullPointerException if the given map is <tt>null</tt> or
317     * this map does not permit <tt>null</tt> keys and a
318     * key in the specified map is <tt>null</tt>.
319     */
320     public void putAll(Map<? extends K, ? extends V> map) {
321     int mapSize = map.size();
322     if (size==0 && mapSize!=0 && map instanceof SortedMap) {
323     Comparator c = ((SortedMap)map).comparator();
324     if (c == comparator || (c != null && c.equals(comparator))) {
325     ++modCount;
326     try {
327     buildFromSorted(mapSize, map.entrySet().iterator(),
328     null, null);
329     } catch (java.io.IOException cannotHappen) {
330     } catch (ClassNotFoundException cannotHappen) {
331     }
332     return;
333     }
334     }
335     super.putAll(map);
336     }
337    
338     /**
339     * Returns this map's entry for the given key, or <tt>null</tt> if the map
340     * does not contain an entry for the key.
341     *
342     * @return this map's entry for the given key, or <tt>null</tt> if the map
343     * does not contain an entry for the key.
344     * @throws ClassCastException if the key cannot be compared with the keys
345     * currently in the map.
346     * @throws NullPointerException key is <tt>null</tt> and this map uses
347     * natural order, or its comparator does not tolerate *
348     * <tt>null</tt> keys.
349     */
350     private Entry<K,V> getEntry(Object key) {
351     // Offload comparator-based version for sake of performance
352     if (comparator != null)
353     return getEntryUsingComparator(key);
354     Comparable<K> k = (Comparable<K>) key;
355     Entry<K,V> p = root;
356     while (p != null) {
357     int cmp = k.compareTo(p.key);
358     if (cmp < 0)
359     p = p.left;
360     else if (cmp > 0)
361     p = p.right;
362     else
363     return p;
364     }
365     return null;
366     }
367    
368     /**
369     * Version of getEntry using comparator. Split off from getEntry
370     * for performance. (This is not worth doing for most methods,
371     * that are less dependent on comparator performance, but is
372     * worthwhile here.)
373     */
374     private Entry<K,V> getEntryUsingComparator(Object key) {
375     K k = (K) key;
376     Comparator<? super K> cpr = comparator;
377     Entry<K,V> p = root;
378     while (p != null) {
379     int cmp = cpr.compare(k, p.key);
380     if (cmp < 0)
381     p = p.left;
382     else if (cmp > 0)
383     p = p.right;
384     else
385     return p;
386     }
387     return null;
388     }
389    
390     /**
391     * Gets the entry corresponding to the specified key; if no such entry
392     * exists, returns the entry for the least key greater than the specified
393     * key; if no such entry exists (i.e., the greatest key in the Tree is less
394     * than the specified key), returns <tt>null</tt>.
395     */
396     private Entry<K,V> getCeilingEntry(K key) {
397     Entry<K,V> p = root;
398     if (p==null)
399     return null;
400    
401     while (true) {
402     int cmp = compare(key, p.key);
403     if (cmp < 0) {
404     if (p.left != null)
405     p = p.left;
406     else
407     return p;
408     } else if (cmp > 0) {
409     if (p.right != null) {
410     p = p.right;
411     } else {
412     Entry<K,V> parent = p.parent;
413     Entry<K,V> ch = p;
414     while (parent != null && ch == parent.right) {
415     ch = parent;
416     parent = parent.parent;
417     }
418     return parent;
419     }
420     } else
421     return p;
422     }
423     }
424    
425     /**
426     * Gets the entry corresponding to the specified key; if no such entry
427     * exists, returns the entry for the greatest key less than the specified
428     * key; if no such entry exists, returns <tt>null</tt>.
429     */
430     private Entry<K,V> getFloorEntry(K key) {
431     Entry<K,V> p = root;
432     if (p==null)
433     return null;
434    
435     while (true) {
436     int cmp = compare(key, p.key);
437     if (cmp > 0) {
438     if (p.right != null)
439     p = p.right;
440     else
441     return p;
442     } else if (cmp < 0) {
443     if (p.left != null) {
444     p = p.left;
445     } else {
446     Entry<K,V> parent = p.parent;
447     Entry<K,V> ch = p;
448     while (parent != null && ch == parent.left) {
449     ch = parent;
450     parent = parent.parent;
451     }
452     return parent;
453     }
454     } else
455     return p;
456    
457     }
458     }
459    
460     /**
461     * Gets the entry for the least key greater than the specified
462     * key; if no such entry exists, returns the entry for the least
463     * key greater than the specified key; if no such entry exists
464     * returns <tt>null</tt>.
465     */
466     private Entry<K,V> getHigherEntry(K key) {
467     Entry<K,V> p = root;
468     if (p==null)
469     return null;
470    
471     while (true) {
472     int cmp = compare(key, p.key);
473     if (cmp < 0) {
474     if (p.left != null)
475     p = p.left;
476     else
477     return p;
478     } else {
479     if (p.right != null) {
480     p = p.right;
481     } else {
482     Entry<K,V> parent = p.parent;
483     Entry<K,V> ch = p;
484     while (parent != null && ch == parent.right) {
485     ch = parent;
486     parent = parent.parent;
487     }
488     return parent;
489     }
490     }
491     }
492     }
493    
494     /**
495     * Returns the entry for the greatest key less than the specified key; if
496     * no such entry exists (i.e., the least key in the Tree is greater than
497     * the specified key), returns <tt>null</tt>.
498     */
499     private Entry<K,V> getLowerEntry(K key) {
500     Entry<K,V> p = root;
501     if (p==null)
502     return null;
503    
504     while (true) {
505     int cmp = compare(key, p.key);
506     if (cmp > 0) {
507     if (p.right != null)
508     p = p.right;
509     else
510     return p;
511     } else {
512     if (p.left != null) {
513     p = p.left;
514     } else {
515     Entry<K,V> parent = p.parent;
516     Entry<K,V> ch = p;
517     while (parent != null && ch == parent.left) {
518     ch = parent;
519     parent = parent.parent;
520     }
521     return parent;
522     }
523     }
524     }
525     }
526    
527     /**
528     * Returns the key corresponding to the specified Entry. Throw
529     * NoSuchElementException if the Entry is <tt>null</tt>.
530     */
531     private static <K> K key(Entry<K,?> e) {
532     if (e==null)
533     throw new NoSuchElementException();
534     return e.key;
535     }
536    
537     /**
538     * Associates the specified value with the specified key in this map.
539     * If the map previously contained a mapping for this key, the old
540     * value is replaced.
541     *
542     * @param key key with which the specified value is to be associated.
543     * @param value value to be associated with the specified key.
544     *
545     * @return previous value associated with specified key, or <tt>null</tt>
546     * if there was no mapping for key. A <tt>null</tt> return can
547     * also indicate that the map previously associated <tt>null</tt>
548     * with the specified key.
549     * @throws ClassCastException key cannot be compared with the keys
550     * currently in the map.
551     * @throws NullPointerException key is <tt>null</tt> and this map uses
552     * natural order, or its comparator does not tolerate
553     * <tt>null</tt> keys.
554     */
555     public V put(K key, V value) {
556     Entry<K,V> t = root;
557    
558     if (t == null) {
559     incrementSize();
560     root = new Entry<K,V>(key, value, null);
561     return null;
562     }
563    
564     while (true) {
565     int cmp = compare(key, t.key);
566     if (cmp == 0) {
567     return t.setValue(value);
568     } else if (cmp < 0) {
569     if (t.left != null) {
570     t = t.left;
571     } else {
572     incrementSize();
573     t.left = new Entry<K,V>(key, value, t);
574     fixAfterInsertion(t.left);
575     return null;
576     }
577     } else { // cmp > 0
578     if (t.right != null) {
579     t = t.right;
580     } else {
581     incrementSize();
582     t.right = new Entry<K,V>(key, value, t);
583     fixAfterInsertion(t.right);
584     return null;
585     }
586     }
587     }
588     }
589    
590     /**
591     * Removes the mapping for this key from this TreeMap if present.
592     *
593     * @param key key for which mapping should be removed
594     * @return previous value associated with specified key, or <tt>null</tt>
595     * if there was no mapping for key. A <tt>null</tt> return can
596     * also indicate that the map previously associated
597     * <tt>null</tt> with the specified key.
598     *
599     * @throws ClassCastException key cannot be compared with the keys
600     * currently in the map.
601     * @throws NullPointerException key is <tt>null</tt> and this map uses
602     * natural order, or its comparator does not tolerate
603     * <tt>null</tt> keys.
604     */
605     public V remove(Object key) {
606     Entry<K,V> p = getEntry(key);
607     if (p == null)
608     return null;
609    
610     V oldValue = p.value;
611     deleteEntry(p);
612     return oldValue;
613     }
614    
615     /**
616     * Removes all mappings from this TreeMap.
617     */
618     public void clear() {
619     modCount++;
620     size = 0;
621     root = null;
622     }
623    
624     /**
625     * Returns a shallow copy of this <tt>TreeMap</tt> instance. (The keys and
626     * values themselves are not cloned.)
627     *
628     * @return a shallow copy of this Map.
629     */
630     public Object clone() {
631     TreeMap<K,V> clone = null;
632     try {
633     clone = (TreeMap<K,V>) super.clone();
634     } catch (CloneNotSupportedException e) {
635     throw new InternalError();
636     }
637    
638     // Put clone into "virgin" state (except for comparator)
639     clone.root = null;
640     clone.size = 0;
641     clone.modCount = 0;
642     clone.entrySet = null;
643     clone.descendingEntrySet = null;
644     clone.descendingKeySet = null;
645    
646     // Initialize clone with our mappings
647     try {
648     clone.buildFromSorted(size, entrySet().iterator(), null, null);
649     } catch (java.io.IOException cannotHappen) {
650     } catch (ClassNotFoundException cannotHappen) {
651     }
652    
653     return clone;
654     }
655    
656     // NavigableMap API methods
657    
658     /**
659     * Returns a key-value mapping associated with the least
660     * key in this map, or <tt>null</tt> if the map is empty.
661     *
662     * @return an Entry with least key, or <tt>null</tt>
663     * if the map is empty.
664     */
665     public Map.Entry<K,V> firstEntry() {
666     Entry<K,V> e = getFirstEntry();
667 dl 1.2 return (e == null)? null : new AbstractMap.SimpleImmutableEntry(e);
668 dl 1.1 }
669    
670     /**
671     * Returns a key-value mapping associated with the greatest
672     * key in this map, or <tt>null</tt> if the map is empty.
673     * The returned entry does <em>not</em> support
674     * the <tt>Entry.setValue</tt> method.
675     *
676     * @return an Entry with greatest key, or <tt>null</tt>
677     * if the map is empty.
678     */
679     public Map.Entry<K,V> lastEntry() {
680     Entry<K,V> e = getLastEntry();
681 dl 1.2 return (e == null)? null : new AbstractMap.SimpleImmutableEntry(e);
682 dl 1.1 }
683    
684     /**
685     * Removes and returns a key-value mapping associated with
686     * the least key in this map, or <tt>null</tt> if the map is empty.
687     *
688     * @return the removed first entry of this map, or <tt>null</tt>
689     * if the map is empty.
690     */
691     public Map.Entry<K,V> pollFirstEntry() {
692     Entry<K,V> p = getFirstEntry();
693     if (p == null)
694     return null;
695 dl 1.2 Map.Entry result = new AbstractMap.SimpleImmutableEntry(p);
696 dl 1.1 deleteEntry(p);
697     return result;
698     }
699    
700     /**
701     * Removes and returns a key-value mapping associated with
702     * the greatest key in this map, or <tt>null</tt> if the map is empty.
703     *
704     * @return the removed last entry of this map, or <tt>null</tt>
705     * if the map is empty.
706     */
707     public Map.Entry<K,V> pollLastEntry() {
708     Entry<K,V> p = getLastEntry();
709     if (p == null)
710     return null;
711 dl 1.2 Map.Entry result = new AbstractMap.SimpleImmutableEntry(p);
712 dl 1.1 deleteEntry(p);
713     return result;
714     }
715    
716     /**
717     * Returns a key-value mapping associated with the least key
718     * greater than or equal to the given key, or <tt>null</tt> if
719     * there is no such entry.
720     *
721     * @param key the key.
722     * @return an Entry associated with ceiling of given key, or
723     * <tt>null</tt> if there is no such Entry.
724     * @throws ClassCastException if key cannot be compared with the
725     * keys currently in the map.
726     * @throws NullPointerException key is <tt>null</tt> and this map uses
727     * natural order, or its comparator does not tolerate
728     * <tt>null</tt> keys.
729     */
730     public Map.Entry<K,V> ceilingEntry(K key) {
731     Entry<K,V> e = getCeilingEntry(key);
732 dl 1.2 return (e == null)? null : new AbstractMap.SimpleImmutableEntry(e);
733 dl 1.1 }
734    
735    
736     /**
737     * Returns least key greater than or equal to the given key, or
738     * <tt>null</tt> if there is no such key.
739     *
740     * @param key the key.
741     * @return the ceiling key, or <tt>null</tt>
742     * if there is no such key.
743     * @throws ClassCastException if key cannot be compared with the keys
744     * currently in the map.
745     * @throws NullPointerException key is <tt>null</tt> and this map uses
746     * natural order, or its comparator does not tolerate
747     * <tt>null</tt> keys.
748     */
749     public K ceilingKey(K key) {
750     Entry<K,V> e = getCeilingEntry(key);
751     return (e == null)? null : e.key;
752     }
753    
754    
755    
756     /**
757     * Returns a key-value mapping associated with the greatest key
758     * less than or equal to the given key, or <tt>null</tt> if there
759     * is no such entry.
760     *
761     * @param key the key.
762     * @return an Entry associated with floor of given key, or <tt>null</tt>
763     * if there is no such Entry.
764     * @throws ClassCastException if key cannot be compared with the keys
765     * currently in the map.
766     * @throws NullPointerException key is <tt>null</tt> and this map uses
767     * natural order, or its comparator does not tolerate
768     * <tt>null</tt> keys.
769     */
770     public Map.Entry<K,V> floorEntry(K key) {
771     Entry<K,V> e = getFloorEntry(key);
772 dl 1.2 return (e == null)? null : new AbstractMap.SimpleImmutableEntry(e);
773 dl 1.1 }
774    
775     /**
776     * Returns the greatest key
777     * less than or equal to the given key, or <tt>null</tt> if there
778     * is no such key.
779     *
780     * @param key the key.
781     * @return the floor of given key, or <tt>null</tt> if there is no
782     * such key.
783     * @throws ClassCastException if key cannot be compared with the keys
784     * currently in the map.
785     * @throws NullPointerException key is <tt>null</tt> and this map uses
786     * natural order, or its comparator does not tolerate
787     * <tt>null</tt> keys.
788     */
789     public K floorKey(K key) {
790     Entry<K,V> e = getFloorEntry(key);
791     return (e == null)? null : e.key;
792     }
793    
794     /**
795     * Returns a key-value mapping associated with the least key
796     * strictly greater than the given key, or <tt>null</tt> if there
797     * is no such entry.
798     *
799     * @param key the key.
800     * @return an Entry with least key greater than the given key, or
801     * <tt>null</tt> if there is no such Entry.
802     * @throws ClassCastException if key cannot be compared with the keys
803     * currently in the map.
804     * @throws NullPointerException key is <tt>null</tt> and this map uses
805     * natural order, or its comparator does not tolerate
806     * <tt>null</tt> keys.
807     */
808     public Map.Entry<K,V> higherEntry(K key) {
809     Entry<K,V> e = getHigherEntry(key);
810 dl 1.2 return (e == null)? null : new AbstractMap.SimpleImmutableEntry(e);
811 dl 1.1 }
812    
813     /**
814     * Returns the least key strictly greater than the given key, or
815     * <tt>null</tt> if there is no such key.
816     *
817     * @param key the key.
818     * @return the least key greater than the given key, or
819     * <tt>null</tt> if there is no such key.
820     * @throws ClassCastException if key cannot be compared with the keys
821     * currently in the map.
822     * @throws NullPointerException key is <tt>null</tt> and this map uses
823     * natural order, or its comparator does not tolerate
824     * <tt>null</tt> keys.
825     */
826     public K higherKey(K key) {
827     Entry<K,V> e = getHigherEntry(key);
828     return (e == null)? null : e.key;
829     }
830    
831     /**
832     * Returns a key-value mapping associated with the greatest
833     * key strictly less than the given key, or <tt>null</tt> if there is no
834     * such entry.
835     *
836     * @param key the key.
837     * @return an Entry with greatest key less than the given
838     * key, or <tt>null</tt> if there is no such Entry.
839     * @throws ClassCastException if key cannot be compared with the keys
840     * currently in the map.
841     * @throws NullPointerException key is <tt>null</tt> and this map uses
842     * natural order, or its comparator does not tolerate
843     * <tt>null</tt> keys.
844     */
845     public Map.Entry<K,V> lowerEntry(K key) {
846     Entry<K,V> e = getLowerEntry(key);
847 dl 1.2 return (e == null)? null : new AbstractMap.SimpleImmutableEntry(e);
848 dl 1.1 }
849    
850     /**
851     * Returns the greatest key strictly less than the given key, or
852     * <tt>null</tt> if there is no such key.
853     *
854     * @param key the key.
855     * @return the greatest key less than the given
856     * key, or <tt>null</tt> if there is no such key.
857     * @throws ClassCastException if key cannot be compared with the keys
858     * currently in the map.
859     * @throws NullPointerException key is <tt>null</tt> and this map uses
860     * natural order, or its comparator does not tolerate
861     * <tt>null</tt> keys.
862     */
863     public K lowerKey(K key) {
864     Entry<K,V> e = getLowerEntry(key);
865     return (e == null)? null : e.key;
866     }
867    
868     // Views
869    
870     /**
871     * Fields initialized to contain an instance of the entry set view
872     * the first time this view is requested. Views are stateless, so
873     * there's no reason to create more than one.
874     */
875     private transient Set<Map.Entry<K,V>> entrySet = null;
876     private transient Set<Map.Entry<K,V>> descendingEntrySet = null;
877     private transient Set<K> descendingKeySet = null;
878    
879     transient Set<K> keySet = null; // XXX remove when integrated
880     transient Collection<V> values = null; // XXX remove when integrated
881    
882     /**
883     * Returns a Set view of the keys contained in this map. The set's
884     * iterator will return the keys in ascending order. The set is backed by
885     * this <tt>TreeMap</tt> instance, so changes to this map are reflected in
886     * the Set, and vice-versa. The Set supports element removal, which
887     * removes the corresponding mapping from the map, via the
888     * <tt>Iterator.remove</tt>, <tt>Set.remove</tt>, <tt>removeAll</tt>,
889     * <tt>retainAll</tt>, and <tt>clear</tt> operations. It does not support
890     * the <tt>add</tt> or <tt>addAll</tt> operations.
891     *
892     * @return a set view of the keys contained in this TreeMap.
893     */
894     public Set<K> keySet() {
895     Set<K> ks = keySet;
896     return (ks != null) ? ks : (keySet = new KeySet());
897     }
898    
899     class KeySet extends AbstractSet<K> {
900     public Iterator<K> iterator() {
901     return new KeyIterator(getFirstEntry());
902     }
903    
904     public int size() {
905     return TreeMap.this.size();
906     }
907    
908     public boolean contains(Object o) {
909     return containsKey(o);
910     }
911    
912     public boolean remove(Object o) {
913     int oldSize = size;
914     TreeMap.this.remove(o);
915     return size != oldSize;
916     }
917    
918     public void clear() {
919     TreeMap.this.clear();
920     }
921     }
922    
923     /**
924     * Returns a collection view of the values contained in this map. The
925     * collection's iterator will return the values in the order that their
926     * corresponding keys appear in the tree. The collection is backed by
927     * this <tt>TreeMap</tt> instance, so changes to this map are reflected in
928     * the collection, and vice-versa. The collection supports element
929     * removal, which removes the corresponding mapping from the map through
930     * the <tt>Iterator.remove</tt>, <tt>Collection.remove</tt>,
931     * <tt>removeAll</tt>, <tt>retainAll</tt>, and <tt>clear</tt> operations.
932     * It does not support the <tt>add</tt> or <tt>addAll</tt> operations.
933     *
934     * @return a collection view of the values contained in this map.
935     */
936     public Collection<V> values() {
937     Collection<V> vs = values;
938     return (vs != null) ? vs : (values = new Values());
939     }
940    
941     class Values extends AbstractCollection<V> {
942     public Iterator<V> iterator() {
943     return new ValueIterator(getFirstEntry());
944     }
945    
946     public int size() {
947     return TreeMap.this.size();
948     }
949    
950     public boolean contains(Object o) {
951     for (Entry<K,V> e = getFirstEntry(); e != null; e = successor(e))
952     if (valEquals(e.getValue(), o))
953     return true;
954     return false;
955     }
956    
957     public boolean remove(Object o) {
958     for (Entry<K,V> e = getFirstEntry(); e != null; e = successor(e)) {
959     if (valEquals(e.getValue(), o)) {
960     deleteEntry(e);
961     return true;
962     }
963     }
964     return false;
965     }
966    
967     public void clear() {
968     TreeMap.this.clear();
969     }
970     }
971    
972     /**
973     * Returns a set view of the mappings contained in this map. The set's
974     * iterator returns the mappings in ascending key order. Each element in
975     * the returned set is a <tt>Map.Entry</tt>. The set is backed by this
976     * map, so changes to this map are reflected in the set, and vice-versa.
977     * The set supports element removal, which removes the corresponding
978     * mapping from the TreeMap, through the <tt>Iterator.remove</tt>,
979     * <tt>Set.remove</tt>, <tt>removeAll</tt>, <tt>retainAll</tt> and
980     * <tt>clear</tt> operations. It does not support the <tt>add</tt> or
981     * <tt>addAll</tt> operations.
982     *
983     * @return a set view of the mappings contained in this map.
984     * @see Map.Entry
985     */
986     public Set<Map.Entry<K,V>> entrySet() {
987     Set<Map.Entry<K,V>> es = entrySet;
988     return (es != null) ? es : (entrySet = new EntrySet());
989     }
990    
991     class EntrySet extends AbstractSet<Map.Entry<K,V>> {
992     public Iterator<Map.Entry<K,V>> iterator() {
993     return new EntryIterator(getFirstEntry());
994     }
995    
996     public boolean contains(Object o) {
997     if (!(o instanceof Map.Entry))
998     return false;
999     Map.Entry<K,V> entry = (Map.Entry<K,V>) o;
1000     V value = entry.getValue();
1001     Entry<K,V> p = getEntry(entry.getKey());
1002     return p != null && valEquals(p.getValue(), value);
1003     }
1004    
1005     public boolean remove(Object o) {
1006     if (!(o instanceof Map.Entry))
1007     return false;
1008     Map.Entry<K,V> entry = (Map.Entry<K,V>) o;
1009     V value = entry.getValue();
1010     Entry<K,V> p = getEntry(entry.getKey());
1011     if (p != null && valEquals(p.getValue(), value)) {
1012     deleteEntry(p);
1013     return true;
1014     }
1015     return false;
1016     }
1017    
1018     public int size() {
1019     return TreeMap.this.size();
1020     }
1021    
1022     public void clear() {
1023     TreeMap.this.clear();
1024     }
1025     }
1026    
1027     /**
1028     * Returns a set view of the mappings contained in this map. The
1029     * set's iterator returns the mappings in descrending key order.
1030     * Each element in the returned set is a <tt>Map.Entry</tt>. The
1031     * set is backed by this map, so changes to this map are reflected
1032     * in the set, and vice-versa. The set supports element removal,
1033     * which removes the corresponding mapping from the TreeMap,
1034     * through the <tt>Iterator.remove</tt>, <tt>Set.remove</tt>,
1035     * <tt>removeAll</tt>, <tt>retainAll</tt> and <tt>clear</tt>
1036     * operations. It does not support the <tt>add</tt> or
1037     * <tt>addAll</tt> operations.
1038     *
1039     * @return a set view of the mappings contained in this map, in
1040     * descending key order
1041     * @see Map.Entry
1042     */
1043     public Set<Map.Entry<K,V>> descendingEntrySet() {
1044     Set<Map.Entry<K,V>> es = descendingEntrySet;
1045     return (es != null) ? es : (descendingEntrySet = new DescendingEntrySet());
1046     }
1047    
1048     class DescendingEntrySet extends EntrySet {
1049     public Iterator<Map.Entry<K,V>> iterator() {
1050     return new DescendingEntryIterator(getLastEntry());
1051     }
1052     }
1053    
1054     /**
1055     * Returns a Set view of the keys contained in this map. The
1056     * set's iterator will return the keys in descending order. The
1057     * map is backed by this <tt>TreeMap</tt> instance, so changes to
1058     * this map are reflected in the Set, and vice-versa. The Set
1059     * supports element removal, which removes the corresponding
1060     * mapping from the map, via the <tt>Iterator.remove</tt>,
1061     * <tt>Set.remove</tt>, <tt>removeAll</tt>, <tt>retainAll</tt>,
1062     * and <tt>clear</tt> operations. It does not support the
1063     * <tt>add</tt> or <tt>addAll</tt> operations.
1064     *
1065     * @return a set view of the keys contained in this TreeMap.
1066     */
1067     public Set<K> descendingKeySet() {
1068     Set<K> ks = descendingKeySet;
1069     return (ks != null) ? ks : (descendingKeySet = new DescendingKeySet());
1070     }
1071    
1072     class DescendingKeySet extends KeySet {
1073     public Iterator<K> iterator() {
1074     return new DescendingKeyIterator(getLastEntry());
1075     }
1076     }
1077    
1078     /**
1079     * Returns a view of the portion of this map whose keys range from
1080     * <tt>fromKey</tt>, inclusive, to <tt>toKey</tt>, exclusive. (If
1081     * <tt>fromKey</tt> and <tt>toKey</tt> are equal, the returned sorted map
1082     * is empty.) The returned sorted map is backed by this map, so changes
1083     * in the returned sorted map are reflected in this map, and vice-versa.
1084     * The returned sorted map supports all optional map operations.<p>
1085     *
1086     * The sorted map returned by this method will throw an
1087     * <tt>IllegalArgumentException</tt> if the user attempts to insert a key
1088     * less than <tt>fromKey</tt> or greater than or equal to
1089     * <tt>toKey</tt>.<p>
1090     *
1091     * Note: this method always returns a <i>half-open range</i> (which
1092     * includes its low endpoint but not its high endpoint). If you need a
1093     * <i>closed range</i> (which includes both endpoints), and the key type
1094     * allows for calculation of the successor a given key, merely request the
1095     * subrange from <tt>lowEndpoint</tt> to <tt>successor(highEndpoint)</tt>.
1096     * For example, suppose that <tt>m</tt> is a sorted map whose keys are
1097     * strings. The following idiom obtains a view containing all of the
1098     * key-value mappings in <tt>m</tt> whose keys are between <tt>low</tt>
1099     * and <tt>high</tt>, inclusive:
1100     * <pre> NavigableMap sub = m.submap(low, high+"\0");</pre>
1101     * A similar technique can be used to generate an <i>open range</i> (which
1102     * contains neither endpoint). The following idiom obtains a view
1103     * containing all of the key-value mappings in <tt>m</tt> whose keys are
1104     * between <tt>low</tt> and <tt>high</tt>, exclusive:
1105     * <pre> NavigableMap sub = m.subMap(low+"\0", high);</pre>
1106     *
1107     * @param fromKey low endpoint (inclusive) of the subMap.
1108     * @param toKey high endpoint (exclusive) of the subMap.
1109     *
1110     * @return a view of the portion of this map whose keys range from
1111     * <tt>fromKey</tt>, inclusive, to <tt>toKey</tt>, exclusive.
1112     *
1113     * @throws ClassCastException if <tt>fromKey</tt> and <tt>toKey</tt>
1114     * cannot be compared to one another using this map's comparator
1115     * (or, if the map has no comparator, using natural ordering).
1116     * @throws IllegalArgumentException if <tt>fromKey</tt> is greater than
1117     * <tt>toKey</tt>.
1118     * @throws NullPointerException if <tt>fromKey</tt> or <tt>toKey</tt> is
1119     * <tt>null</tt> and this map uses natural order, or its
1120     * comparator does not tolerate <tt>null</tt> keys.
1121     */
1122     public NavigableMap<K,V> subMap(K fromKey, K toKey) {
1123     return new SubMap(fromKey, toKey);
1124     }
1125    
1126     /**
1127     * Returns a view of the portion of this map whose keys are strictly less
1128     * than <tt>toKey</tt>. The returned sorted map is backed by this map, so
1129     * changes in the returned sorted map are reflected in this map, and
1130     * vice-versa. The returned sorted map supports all optional map
1131     * operations.<p>
1132     *
1133     * The sorted map returned by this method will throw an
1134     * <tt>IllegalArgumentException</tt> if the user attempts to insert a key
1135     * greater than or equal to <tt>toKey</tt>.<p>
1136     *
1137     * Note: this method always returns a view that does not contain its
1138     * (high) endpoint. If you need a view that does contain this endpoint,
1139     * and the key type allows for calculation of the successor a given key,
1140     * merely request a headMap bounded by <tt>successor(highEndpoint)</tt>.
1141     * For example, suppose that suppose that <tt>m</tt> is a sorted map whose
1142     * keys are strings. The following idiom obtains a view containing all of
1143     * the key-value mappings in <tt>m</tt> whose keys are less than or equal
1144     * to <tt>high</tt>:
1145     * <pre>
1146     * NavigableMap head = m.headMap(high+"\0");
1147     * </pre>
1148     *
1149     * @param toKey high endpoint (exclusive) of the headMap.
1150     * @return a view of the portion of this map whose keys are strictly
1151     * less than <tt>toKey</tt>.
1152     *
1153     * @throws ClassCastException if <tt>toKey</tt> is not compatible
1154     * with this map's comparator (or, if the map has no comparator,
1155     * if <tt>toKey</tt> does not implement <tt>Comparable</tt>).
1156     * @throws IllegalArgumentException if this map is itself a subMap,
1157     * headMap, or tailMap, and <tt>toKey</tt> is not within the
1158     * specified range of the subMap, headMap, or tailMap.
1159     * @throws NullPointerException if <tt>toKey</tt> is <tt>null</tt> and
1160     * this map uses natural order, or its comparator does not
1161     * tolerate <tt>null</tt> keys.
1162     */
1163     public NavigableMap<K,V> headMap(K toKey) {
1164     return new SubMap(toKey, true);
1165     }
1166    
1167     /**
1168     * Returns a view of the portion of this map whose keys are greater than
1169     * or equal to <tt>fromKey</tt>. The returned sorted map is backed by
1170     * this map, so changes in the returned sorted map are reflected in this
1171     * map, and vice-versa. The returned sorted map supports all optional map
1172     * operations.<p>
1173     *
1174     * The sorted map returned by this method will throw an
1175     * <tt>IllegalArgumentException</tt> if the user attempts to insert a key
1176     * less than <tt>fromKey</tt>.<p>
1177     *
1178     * Note: this method always returns a view that contains its (low)
1179     * endpoint. If you need a view that does not contain this endpoint, and
1180     * the element type allows for calculation of the successor a given value,
1181     * merely request a tailMap bounded by <tt>successor(lowEndpoint)</tt>.
1182     * For example, suppose that <tt>m</tt> is a sorted map whose keys
1183     * are strings. The following idiom obtains a view containing
1184     * all of the key-value mappings in <tt>m</tt> whose keys are strictly
1185     * greater than <tt>low</tt>: <pre>
1186     * NavigableMap tail = m.tailMap(low+"\0");
1187     * </pre>
1188     *
1189     * @param fromKey low endpoint (inclusive) of the tailMap.
1190     * @return a view of the portion of this map whose keys are greater
1191     * than or equal to <tt>fromKey</tt>.
1192     * @throws ClassCastException if <tt>fromKey</tt> is not compatible
1193     * with this map's comparator (or, if the map has no comparator,
1194     * if <tt>fromKey</tt> does not implement <tt>Comparable</tt>).
1195     * @throws IllegalArgumentException if this map is itself a subMap,
1196     * headMap, or tailMap, and <tt>fromKey</tt> is not within the
1197     * specified range of the subMap, headMap, or tailMap.
1198     * @throws NullPointerException if <tt>fromKey</tt> is <tt>null</tt> and
1199     * this map uses natural order, or its comparator does not
1200     * tolerate <tt>null</tt> keys.
1201     */
1202     public NavigableMap<K,V> tailMap(K fromKey) {
1203     return new SubMap(fromKey, false);
1204     }
1205    
1206     private class SubMap
1207     extends AbstractMap<K,V>
1208     implements NavigableMap<K,V>, java.io.Serializable {
1209     private static final long serialVersionUID = -6520786458950516097L;
1210    
1211     /**
1212     * fromKey is significant only if fromStart is false. Similarly,
1213     * toKey is significant only if toStart is false.
1214     */
1215     private boolean fromStart = false, toEnd = false;
1216     private K fromKey, toKey;
1217    
1218     SubMap(K fromKey, K toKey) {
1219     if (compare(fromKey, toKey) > 0)
1220     throw new IllegalArgumentException("fromKey > toKey");
1221     this.fromKey = fromKey;
1222     this.toKey = toKey;
1223     }
1224    
1225     SubMap(K key, boolean headMap) {
1226     compare(key, key); // Type-check key
1227    
1228     if (headMap) {
1229     fromStart = true;
1230     toKey = key;
1231     } else {
1232     toEnd = true;
1233     fromKey = key;
1234     }
1235     }
1236    
1237     SubMap(boolean fromStart, K fromKey, boolean toEnd, K toKey) {
1238     this.fromStart = fromStart;
1239     this.fromKey= fromKey;
1240     this.toEnd = toEnd;
1241     this.toKey = toKey;
1242     }
1243    
1244     public boolean isEmpty() {
1245     return entrySet.isEmpty();
1246     }
1247    
1248     public boolean containsKey(Object key) {
1249     return inRange((K) key) && TreeMap.this.containsKey(key);
1250     }
1251    
1252     public V get(Object key) {
1253     if (!inRange((K) key))
1254     return null;
1255     return TreeMap.this.get(key);
1256     }
1257    
1258     public V put(K key, V value) {
1259     if (!inRange(key))
1260     throw new IllegalArgumentException("key out of range");
1261     return TreeMap.this.put(key, value);
1262     }
1263    
1264     public V remove(Object key) {
1265     if (!inRange((K) key))
1266     return null;
1267     return TreeMap.this.remove(key);
1268     }
1269    
1270     public Comparator<? super K> comparator() {
1271     return comparator;
1272     }
1273    
1274     public K firstKey() {
1275     TreeMap.Entry<K,V> e = fromStart ? getFirstEntry() : getCeilingEntry(fromKey);
1276     K first = key(e);
1277     if (!toEnd && compare(first, toKey) >= 0)
1278     throw(new NoSuchElementException());
1279     return first;
1280     }
1281    
1282     public K lastKey() {
1283     TreeMap.Entry<K,V> e = toEnd ? getLastEntry() : getLowerEntry(toKey);
1284     K last = key(e);
1285     if (!fromStart && compare(last, fromKey) < 0)
1286     throw(new NoSuchElementException());
1287     return last;
1288     }
1289    
1290     public Map.Entry<K,V> firstEntry() {
1291     TreeMap.Entry<K,V> e = fromStart ?
1292     getFirstEntry() : getCeilingEntry(fromKey);
1293     if (e == null || (!toEnd && compare(e.key, toKey) >= 0))
1294     return null;
1295     return e;
1296     }
1297    
1298     public Map.Entry<K,V> lastEntry() {
1299     TreeMap.Entry<K,V> e = toEnd ?
1300     getLastEntry() : getLowerEntry(toKey);
1301     if (e == null || (!fromStart && compare(e.key, fromKey) < 0))
1302     return null;
1303     return e;
1304     }
1305    
1306     public Map.Entry<K,V> pollFirstEntry() {
1307     TreeMap.Entry<K,V> e = fromStart ?
1308     getFirstEntry() : getCeilingEntry(fromKey);
1309     if (e == null || (!fromStart && compare(e.key, fromKey) < 0))
1310     return null;
1311 dl 1.2 Map.Entry result = new AbstractMap.SimpleImmutableEntry(e);
1312 dl 1.1 deleteEntry(e);
1313     return result;
1314     }
1315    
1316     public Map.Entry<K,V> pollLastEntry() {
1317     TreeMap.Entry<K,V> e = toEnd ?
1318     getLastEntry() : getLowerEntry(toKey);
1319     if (e == null || (!toEnd && compare(e.key, toKey) >= 0))
1320     return null;
1321 dl 1.2 Map.Entry result = new AbstractMap.SimpleImmutableEntry(e);
1322 dl 1.1 deleteEntry(e);
1323     return result;
1324     }
1325    
1326     private TreeMap.Entry<K,V> subceiling(K key) {
1327     TreeMap.Entry<K,V> e = (!fromStart && compare(key, fromKey) < 0)?
1328     getCeilingEntry(fromKey) : getCeilingEntry(key);
1329     if (e == null || (!toEnd && compare(e.key, toKey) >= 0))
1330     return null;
1331     return e;
1332     }
1333    
1334     public Map.Entry<K,V> ceilingEntry(K key) {
1335     TreeMap.Entry<K,V> e = subceiling(key);
1336 dl 1.2 return e == null? null : new AbstractMap.SimpleImmutableEntry(e);
1337 dl 1.1 }
1338    
1339     public K ceilingKey(K key) {
1340     TreeMap.Entry<K,V> e = subceiling(key);
1341     return e == null? null : e.key;
1342     }
1343    
1344    
1345     private TreeMap.Entry<K,V> subhigher(K key) {
1346     TreeMap.Entry<K,V> e = (!fromStart && compare(key, fromKey) < 0)?
1347     getCeilingEntry(fromKey) : getHigherEntry(key);
1348     if (e == null || (!toEnd && compare(e.key, toKey) >= 0))
1349     return null;
1350     return e;
1351     }
1352    
1353     public Map.Entry<K,V> higherEntry(K key) {
1354     TreeMap.Entry<K,V> e = subhigher(key);
1355 dl 1.2 return e == null? null : new AbstractMap.SimpleImmutableEntry(e);
1356 dl 1.1 }
1357    
1358     public K higherKey(K key) {
1359     TreeMap.Entry<K,V> e = subhigher(key);
1360     return e == null? null : e.key;
1361     }
1362    
1363     private TreeMap.Entry<K,V> subfloor(K key) {
1364     TreeMap.Entry<K,V> e = (!toEnd && compare(key, toKey) >= 0)?
1365     getLowerEntry(toKey) : getFloorEntry(key);
1366     if (e == null || (!fromStart && compare(e.key, fromKey) < 0))
1367     return null;
1368     return e;
1369     }
1370    
1371     public Map.Entry<K,V> floorEntry(K key) {
1372     TreeMap.Entry<K,V> e = subfloor(key);
1373 dl 1.2 return e == null? null : new AbstractMap.SimpleImmutableEntry(e);
1374 dl 1.1 }
1375    
1376     public K floorKey(K key) {
1377     TreeMap.Entry<K,V> e = subfloor(key);
1378     return e == null? null : e.key;
1379     }
1380    
1381     private TreeMap.Entry<K,V> sublower(K key) {
1382     TreeMap.Entry<K,V> e = (!toEnd && compare(key, toKey) >= 0)?
1383     getLowerEntry(toKey) : getLowerEntry(key);
1384     if (e == null || (!fromStart && compare(e.key, fromKey) < 0))
1385     return null;
1386     return e;
1387     }
1388    
1389     public Map.Entry<K,V> lowerEntry(K key) {
1390     TreeMap.Entry<K,V> e = sublower(key);
1391 dl 1.2 return e == null? null : new AbstractMap.SimpleImmutableEntry(e);
1392 dl 1.1 }
1393    
1394     public K lowerKey(K key) {
1395     TreeMap.Entry<K,V> e = sublower(key);
1396     return e == null? null : e.key;
1397     }
1398    
1399     private transient Set<Map.Entry<K,V>> entrySet = new EntrySetView();
1400    
1401     public Set<Map.Entry<K,V>> entrySet() {
1402     return entrySet;
1403     }
1404    
1405     private class EntrySetView extends AbstractSet<Map.Entry<K,V>> {
1406     private transient int size = -1, sizeModCount;
1407    
1408     public int size() {
1409     if (size == -1 || sizeModCount != TreeMap.this.modCount) {
1410     size = 0; sizeModCount = TreeMap.this.modCount;
1411     Iterator i = iterator();
1412     while (i.hasNext()) {
1413     size++;
1414     i.next();
1415     }
1416     }
1417     return size;
1418     }
1419    
1420     public boolean isEmpty() {
1421     return !iterator().hasNext();
1422     }
1423    
1424     public boolean contains(Object o) {
1425     if (!(o instanceof Map.Entry))
1426     return false;
1427     Map.Entry<K,V> entry = (Map.Entry<K,V>) o;
1428     K key = entry.getKey();
1429     if (!inRange(key))
1430     return false;
1431     TreeMap.Entry node = getEntry(key);
1432     return node != null &&
1433     valEquals(node.getValue(), entry.getValue());
1434     }
1435    
1436     public boolean remove(Object o) {
1437     if (!(o instanceof Map.Entry))
1438     return false;
1439     Map.Entry<K,V> entry = (Map.Entry<K,V>) o;
1440     K key = entry.getKey();
1441     if (!inRange(key))
1442     return false;
1443     TreeMap.Entry<K,V> node = getEntry(key);
1444     if (node!=null && valEquals(node.getValue(),entry.getValue())){
1445     deleteEntry(node);
1446     return true;
1447     }
1448     return false;
1449     }
1450    
1451     public Iterator<Map.Entry<K,V>> iterator() {
1452     return new SubMapEntryIterator(
1453     (fromStart ? getFirstEntry() : getCeilingEntry(fromKey)),
1454     (toEnd ? null : getCeilingEntry(toKey)));
1455     }
1456     }
1457    
1458     private transient Set<Map.Entry<K,V>> descendingEntrySetView = null;
1459     private transient Set<K> descendingKeySetView = null;
1460    
1461     public Set<Map.Entry<K,V>> descendingEntrySet() {
1462     Set<Map.Entry<K,V>> es = descendingEntrySetView;
1463     return (es != null) ? es : (descendingEntrySetView = new DescendingEntrySetView());
1464     }
1465    
1466     public Set<K> descendingKeySet() {
1467     Set<K> ks = descendingKeySetView;
1468     return (ks != null) ? ks : (descendingKeySetView = new DescendingKeySetView());
1469     }
1470    
1471     private class DescendingEntrySetView extends EntrySetView {
1472     public Iterator<Map.Entry<K,V>> iterator() {
1473     return new DescendingSubMapEntryIterator
1474     ((toEnd ? getLastEntry() : getLowerEntry(toKey)),
1475     (fromStart ? null : getLowerEntry(fromKey)));
1476     }
1477     }
1478    
1479     private class DescendingKeySetView extends AbstractSet<K> {
1480     public Iterator<K> iterator() {
1481     return new Iterator<K>() {
1482     private Iterator<Entry<K,V>> i = descendingEntrySet().iterator();
1483    
1484     public boolean hasNext() { return i.hasNext(); }
1485     public K next() { return i.next().getKey(); }
1486     public void remove() { i.remove(); }
1487     };
1488     }
1489    
1490     public int size() {
1491     return SubMap.this.size();
1492     }
1493    
1494     public boolean contains(Object k) {
1495     return SubMap.this.containsKey(k);
1496     }
1497     }
1498    
1499    
1500     public NavigableMap<K,V> subMap(K fromKey, K toKey) {
1501     if (!inRange2(fromKey))
1502     throw new IllegalArgumentException("fromKey out of range");
1503     if (!inRange2(toKey))
1504     throw new IllegalArgumentException("toKey out of range");
1505     return new SubMap(fromKey, toKey);
1506     }
1507    
1508     public NavigableMap<K,V> headMap(K toKey) {
1509     if (!inRange2(toKey))
1510     throw new IllegalArgumentException("toKey out of range");
1511     return new SubMap(fromStart, fromKey, false, toKey);
1512     }
1513    
1514     public NavigableMap<K,V> tailMap(K fromKey) {
1515     if (!inRange2(fromKey))
1516     throw new IllegalArgumentException("fromKey out of range");
1517     return new SubMap(false, fromKey, toEnd, toKey);
1518     }
1519    
1520     private boolean inRange(K key) {
1521     return (fromStart || compare(key, fromKey) >= 0) &&
1522     (toEnd || compare(key, toKey) < 0);
1523     }
1524    
1525     // This form allows the high endpoint (as well as all legit keys)
1526     private boolean inRange2(K key) {
1527     return (fromStart || compare(key, fromKey) >= 0) &&
1528     (toEnd || compare(key, toKey) <= 0);
1529     }
1530     }
1531    
1532     /**
1533     * TreeMap Iterator.
1534     */
1535     abstract class PrivateEntryIterator<T> implements Iterator<T> {
1536     int expectedModCount = TreeMap.this.modCount;
1537     Entry<K,V> lastReturned = null;
1538     Entry<K,V> next;
1539    
1540     PrivateEntryIterator(Entry<K,V> first) {
1541     next = first;
1542     }
1543    
1544     public boolean hasNext() {
1545     return next != null;
1546     }
1547    
1548     Entry<K,V> nextEntry() {
1549     if (next == null)
1550     throw new NoSuchElementException();
1551     if (modCount != expectedModCount)
1552     throw new ConcurrentModificationException();
1553     lastReturned = next;
1554     next = successor(next);
1555     return lastReturned;
1556     }
1557    
1558     public void remove() {
1559     if (lastReturned == null)
1560     throw new IllegalStateException();
1561     if (modCount != expectedModCount)
1562     throw new ConcurrentModificationException();
1563     if (lastReturned.left != null && lastReturned.right != null)
1564     next = lastReturned;
1565     deleteEntry(lastReturned);
1566     expectedModCount++;
1567     lastReturned = null;
1568     }
1569     }
1570    
1571     class EntryIterator extends PrivateEntryIterator<Map.Entry<K,V>> {
1572     EntryIterator(Entry<K,V> first) {
1573     super(first);
1574     }
1575    
1576     public Map.Entry<K,V> next() {
1577     return nextEntry();
1578     }
1579     }
1580    
1581     class KeyIterator extends PrivateEntryIterator<K> {
1582     KeyIterator(Entry<K,V> first) {
1583     super(first);
1584     }
1585     public K next() {
1586     return nextEntry().key;
1587     }
1588     }
1589    
1590     class ValueIterator extends PrivateEntryIterator<V> {
1591     ValueIterator(Entry<K,V> first) {
1592     super(first);
1593     }
1594     public V next() {
1595     return nextEntry().value;
1596     }
1597     }
1598    
1599     class SubMapEntryIterator extends PrivateEntryIterator<Map.Entry<K,V>> {
1600     private final K firstExcludedKey;
1601    
1602     SubMapEntryIterator(Entry<K,V> first, Entry<K,V> firstExcluded) {
1603     super(first);
1604     firstExcludedKey = (firstExcluded == null
1605     ? null
1606     : firstExcluded.key);
1607     }
1608    
1609     public boolean hasNext() {
1610     return next != null && next.key != firstExcludedKey;
1611     }
1612    
1613     public Map.Entry<K,V> next() {
1614     if (next == null || next.key == firstExcludedKey)
1615     throw new NoSuchElementException();
1616     return nextEntry();
1617     }
1618     }
1619    
1620    
1621     /**
1622     * Base for Descending Iterators.
1623     */
1624     abstract class DescendingPrivateEntryIterator<T> extends PrivateEntryIterator<T> {
1625     DescendingPrivateEntryIterator(Entry<K,V> first) {
1626     super(first);
1627     }
1628    
1629     Entry<K,V> nextEntry() {
1630     if (next == null)
1631     throw new NoSuchElementException();
1632     if (modCount != expectedModCount)
1633     throw new ConcurrentModificationException();
1634     lastReturned = next;
1635     next = predecessor(next);
1636     return lastReturned;
1637     }
1638     }
1639    
1640     class DescendingEntryIterator extends DescendingPrivateEntryIterator<Map.Entry<K,V>> {
1641     DescendingEntryIterator(Entry<K,V> first) {
1642     super(first);
1643     }
1644     public Map.Entry<K,V> next() {
1645     return nextEntry();
1646     }
1647     }
1648    
1649     class DescendingKeyIterator extends DescendingPrivateEntryIterator<K> {
1650     DescendingKeyIterator(Entry<K,V> first) {
1651     super(first);
1652     }
1653     public K next() {
1654     return nextEntry().key;
1655     }
1656     }
1657    
1658    
1659     class DescendingSubMapEntryIterator extends DescendingPrivateEntryIterator<Map.Entry<K,V>> {
1660     private final K lastExcludedKey;
1661    
1662     DescendingSubMapEntryIterator(Entry<K,V> last, Entry<K,V> lastExcluded) {
1663     super(last);
1664     lastExcludedKey = (lastExcluded == null
1665     ? null
1666     : lastExcluded.key);
1667     }
1668    
1669     public boolean hasNext() {
1670     return next != null && next.key != lastExcludedKey;
1671     }
1672    
1673     public Map.Entry<K,V> next() {
1674     if (next == null || next.key == lastExcludedKey)
1675     throw new NoSuchElementException();
1676     return nextEntry();
1677     }
1678    
1679     }
1680    
1681    
1682     /**
1683     * Compares two keys using the correct comparison method for this TreeMap.
1684     */
1685     private int compare(K k1, K k2) {
1686     return (comparator==null ? ((Comparable</*-*/K>)k1).compareTo(k2)
1687     : comparator.compare((K)k1, (K)k2));
1688     }
1689    
1690     /**
1691     * Test two values for equality. Differs from o1.equals(o2) only in
1692     * that it copes with <tt>null</tt> o1 properly.
1693     */
1694     private static boolean valEquals(Object o1, Object o2) {
1695     return (o1==null ? o2==null : o1.equals(o2));
1696     }
1697    
1698     private static final boolean RED = false;
1699     private static final boolean BLACK = true;
1700    
1701     /**
1702     * Node in the Tree. Doubles as a means to pass key-value pairs back to
1703     * user (see Map.Entry).
1704     */
1705    
1706     static class Entry<K,V> implements Map.Entry<K,V> {
1707     K key;
1708     V value;
1709     Entry<K,V> left = null;
1710     Entry<K,V> right = null;
1711     Entry<K,V> parent;
1712     boolean color = BLACK;
1713    
1714     /**
1715     * Make a new cell with given key, value, and parent, and with
1716     * <tt>null</tt> child links, and BLACK color.
1717     */
1718     Entry(K key, V value, Entry<K,V> parent) {
1719     this.key = key;
1720     this.value = value;
1721     this.parent = parent;
1722     }
1723    
1724     /**
1725     * Returns the key.
1726     *
1727     * @return the key.
1728     */
1729     public K getKey() {
1730     return key;
1731     }
1732    
1733     /**
1734     * Returns the value associated with the key.
1735     *
1736     * @return the value associated with the key.
1737     */
1738     public V getValue() {
1739     return value;
1740     }
1741    
1742     /**
1743     * Replaces the value currently associated with the key with the given
1744     * value.
1745     *
1746     * @return the value associated with the key before this method was
1747     * called.
1748     */
1749     public V setValue(V value) {
1750     V oldValue = this.value;
1751     this.value = value;
1752     return oldValue;
1753     }
1754    
1755     public boolean equals(Object o) {
1756     if (!(o instanceof Map.Entry))
1757     return false;
1758     Map.Entry e = (Map.Entry)o;
1759    
1760     return valEquals(key,e.getKey()) && valEquals(value,e.getValue());
1761     }
1762    
1763     public int hashCode() {
1764     int keyHash = (key==null ? 0 : key.hashCode());
1765     int valueHash = (value==null ? 0 : value.hashCode());
1766     return keyHash ^ valueHash;
1767     }
1768    
1769     public String toString() {
1770     return key + "=" + value;
1771     }
1772     }
1773    
1774     /**
1775     * Returns the first Entry in the TreeMap (according to the TreeMap's
1776     * key-sort function). Returns null if the TreeMap is empty.
1777     */
1778     private Entry<K,V> getFirstEntry() {
1779     Entry<K,V> p = root;
1780     if (p != null)
1781     while (p.left != null)
1782     p = p.left;
1783     return p;
1784     }
1785    
1786     /**
1787     * Returns the last Entry in the TreeMap (according to the TreeMap's
1788     * key-sort function). Returns null if the TreeMap is empty.
1789     */
1790     private Entry<K,V> getLastEntry() {
1791     Entry<K,V> p = root;
1792     if (p != null)
1793     while (p.right != null)
1794     p = p.right;
1795     return p;
1796     }
1797    
1798     /**
1799     * Returns the successor of the specified Entry, or null if no such.
1800     */
1801     private Entry<K,V> successor(Entry<K,V> t) {
1802     if (t == null)
1803     return null;
1804     else if (t.right != null) {
1805     Entry<K,V> p = t.right;
1806     while (p.left != null)
1807     p = p.left;
1808     return p;
1809     } else {
1810     Entry<K,V> p = t.parent;
1811     Entry<K,V> ch = t;
1812     while (p != null && ch == p.right) {
1813     ch = p;
1814     p = p.parent;
1815     }
1816     return p;
1817     }
1818     }
1819    
1820     /**
1821     * Returns the predecessor of the specified Entry, or null if no such.
1822     */
1823     private Entry<K,V> predecessor(Entry<K,V> t) {
1824     if (t == null)
1825     return null;
1826     else if (t.left != null) {
1827     Entry<K,V> p = t.left;
1828     while (p.right != null)
1829     p = p.right;
1830     return p;
1831     } else {
1832     Entry<K,V> p = t.parent;
1833     Entry<K,V> ch = t;
1834     while (p != null && ch == p.left) {
1835     ch = p;
1836     p = p.parent;
1837     }
1838     return p;
1839     }
1840     }
1841    
1842     /**
1843     * Balancing operations.
1844     *
1845     * Implementations of rebalancings during insertion and deletion are
1846     * slightly different than the CLR version. Rather than using dummy
1847     * nilnodes, we use a set of accessors that deal properly with null. They
1848     * are used to avoid messiness surrounding nullness checks in the main
1849     * algorithms.
1850     */
1851    
1852     private static <K,V> boolean colorOf(Entry<K,V> p) {
1853     return (p == null ? BLACK : p.color);
1854     }
1855    
1856     private static <K,V> Entry<K,V> parentOf(Entry<K,V> p) {
1857     return (p == null ? null: p.parent);
1858     }
1859    
1860     private static <K,V> void setColor(Entry<K,V> p, boolean c) {
1861     if (p != null)
1862     p.color = c;
1863     }
1864    
1865     private static <K,V> Entry<K,V> leftOf(Entry<K,V> p) {
1866     return (p == null) ? null: p.left;
1867     }
1868    
1869     private static <K,V> Entry<K,V> rightOf(Entry<K,V> p) {
1870     return (p == null) ? null: p.right;
1871     }
1872    
1873     /** From CLR **/
1874     private void rotateLeft(Entry<K,V> p) {
1875     Entry<K,V> r = p.right;
1876     p.right = r.left;
1877     if (r.left != null)
1878     r.left.parent = p;
1879     r.parent = p.parent;
1880     if (p.parent == null)
1881     root = r;
1882     else if (p.parent.left == p)
1883     p.parent.left = r;
1884     else
1885     p.parent.right = r;
1886     r.left = p;
1887     p.parent = r;
1888     }
1889    
1890     /** From CLR **/
1891     private void rotateRight(Entry<K,V> p) {
1892     Entry<K,V> l = p.left;
1893     p.left = l.right;
1894     if (l.right != null) l.right.parent = p;
1895     l.parent = p.parent;
1896     if (p.parent == null)
1897     root = l;
1898     else if (p.parent.right == p)
1899     p.parent.right = l;
1900     else p.parent.left = l;
1901     l.right = p;
1902     p.parent = l;
1903     }
1904    
1905    
1906     /** From CLR **/
1907     private void fixAfterInsertion(Entry<K,V> x) {
1908     x.color = RED;
1909    
1910     while (x != null && x != root && x.parent.color == RED) {
1911     if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
1912     Entry<K,V> y = rightOf(parentOf(parentOf(x)));
1913     if (colorOf(y) == RED) {
1914     setColor(parentOf(x), BLACK);
1915     setColor(y, BLACK);
1916     setColor(parentOf(parentOf(x)), RED);
1917     x = parentOf(parentOf(x));
1918     } else {
1919     if (x == rightOf(parentOf(x))) {
1920     x = parentOf(x);
1921     rotateLeft(x);
1922     }
1923     setColor(parentOf(x), BLACK);
1924     setColor(parentOf(parentOf(x)), RED);
1925     if (parentOf(parentOf(x)) != null)
1926     rotateRight(parentOf(parentOf(x)));
1927     }
1928     } else {
1929     Entry<K,V> y = leftOf(parentOf(parentOf(x)));
1930     if (colorOf(y) == RED) {
1931     setColor(parentOf(x), BLACK);
1932     setColor(y, BLACK);
1933     setColor(parentOf(parentOf(x)), RED);
1934     x = parentOf(parentOf(x));
1935     } else {
1936     if (x == leftOf(parentOf(x))) {
1937     x = parentOf(x);
1938     rotateRight(x);
1939     }
1940     setColor(parentOf(x), BLACK);
1941     setColor(parentOf(parentOf(x)), RED);
1942     if (parentOf(parentOf(x)) != null)
1943     rotateLeft(parentOf(parentOf(x)));
1944     }
1945     }
1946     }
1947     root.color = BLACK;
1948     }
1949    
1950     /**
1951     * Delete node p, and then rebalance the tree.
1952     */
1953    
1954     private void deleteEntry(Entry<K,V> p) {
1955     decrementSize();
1956    
1957     // If strictly internal, copy successor's element to p and then make p
1958     // point to successor.
1959     if (p.left != null && p.right != null) {
1960     Entry<K,V> s = successor (p);
1961     p.key = s.key;
1962     p.value = s.value;
1963     p = s;
1964     } // p has 2 children
1965    
1966     // Start fixup at replacement node, if it exists.
1967     Entry<K,V> replacement = (p.left != null ? p.left : p.right);
1968    
1969     if (replacement != null) {
1970     // Link replacement to parent
1971     replacement.parent = p.parent;
1972     if (p.parent == null)
1973     root = replacement;
1974     else if (p == p.parent.left)
1975     p.parent.left = replacement;
1976     else
1977     p.parent.right = replacement;
1978    
1979     // Null out links so they are OK to use by fixAfterDeletion.
1980     p.left = p.right = p.parent = null;
1981    
1982     // Fix replacement
1983     if (p.color == BLACK)
1984     fixAfterDeletion(replacement);
1985     } else if (p.parent == null) { // return if we are the only node.
1986     root = null;
1987     } else { // No children. Use self as phantom replacement and unlink.
1988     if (p.color == BLACK)
1989     fixAfterDeletion(p);
1990    
1991     if (p.parent != null) {
1992     if (p == p.parent.left)
1993     p.parent.left = null;
1994     else if (p == p.parent.right)
1995     p.parent.right = null;
1996     p.parent = null;
1997     }
1998     }
1999     }
2000    
2001     /** From CLR **/
2002     private void fixAfterDeletion(Entry<K,V> x) {
2003     while (x != root && colorOf(x) == BLACK) {
2004     if (x == leftOf(parentOf(x))) {
2005     Entry<K,V> sib = rightOf(parentOf(x));
2006    
2007     if (colorOf(sib) == RED) {
2008     setColor(sib, BLACK);
2009     setColor(parentOf(x), RED);
2010     rotateLeft(parentOf(x));
2011     sib = rightOf(parentOf(x));
2012     }
2013    
2014     if (colorOf(leftOf(sib)) == BLACK &&
2015     colorOf(rightOf(sib)) == BLACK) {
2016     setColor(sib, RED);
2017     x = parentOf(x);
2018     } else {
2019     if (colorOf(rightOf(sib)) == BLACK) {
2020     setColor(leftOf(sib), BLACK);
2021     setColor(sib, RED);
2022     rotateRight(sib);
2023     sib = rightOf(parentOf(x));
2024     }
2025     setColor(sib, colorOf(parentOf(x)));
2026     setColor(parentOf(x), BLACK);
2027     setColor(rightOf(sib), BLACK);
2028     rotateLeft(parentOf(x));
2029     x = root;
2030     }
2031     } else { // symmetric
2032     Entry<K,V> sib = leftOf(parentOf(x));
2033    
2034     if (colorOf(sib) == RED) {
2035     setColor(sib, BLACK);
2036     setColor(parentOf(x), RED);
2037     rotateRight(parentOf(x));
2038     sib = leftOf(parentOf(x));
2039     }
2040    
2041     if (colorOf(rightOf(sib)) == BLACK &&
2042     colorOf(leftOf(sib)) == BLACK) {
2043     setColor(sib, RED);
2044     x = parentOf(x);
2045     } else {
2046     if (colorOf(leftOf(sib)) == BLACK) {
2047     setColor(rightOf(sib), BLACK);
2048     setColor(sib, RED);
2049     rotateLeft(sib);
2050     sib = leftOf(parentOf(x));
2051     }
2052     setColor(sib, colorOf(parentOf(x)));
2053     setColor(parentOf(x), BLACK);
2054     setColor(leftOf(sib), BLACK);
2055     rotateRight(parentOf(x));
2056     x = root;
2057     }
2058     }
2059     }
2060    
2061     setColor(x, BLACK);
2062     }
2063    
2064     private static final long serialVersionUID = 919286545866124006L;
2065    
2066     /**
2067     * Save the state of the <tt>TreeMap</tt> instance to a stream (i.e.,
2068     * serialize it).
2069     *
2070     * @serialData The <i>size</i> of the TreeMap (the number of key-value
2071     * mappings) is emitted (int), followed by the key (Object)
2072     * and value (Object) for each key-value mapping represented
2073     * by the TreeMap. The key-value mappings are emitted in
2074     * key-order (as determined by the TreeMap's Comparator,
2075     * or by the keys' natural ordering if the TreeMap has no
2076     * Comparator).
2077     */
2078     private void writeObject(java.io.ObjectOutputStream s)
2079     throws java.io.IOException {
2080     // Write out the Comparator and any hidden stuff
2081     s.defaultWriteObject();
2082    
2083     // Write out size (number of Mappings)
2084     s.writeInt(size);
2085    
2086     // Write out keys and values (alternating)
2087     for (Iterator<Map.Entry<K,V>> i = entrySet().iterator(); i.hasNext(); ) {
2088     Map.Entry<K,V> e = i.next();
2089     s.writeObject(e.getKey());
2090     s.writeObject(e.getValue());
2091     }
2092     }
2093    
2094    
2095    
2096     /**
2097     * Reconstitute the <tt>TreeMap</tt> instance from a stream (i.e.,
2098     * deserialize it).
2099     */
2100     private void readObject(final java.io.ObjectInputStream s)
2101     throws java.io.IOException, ClassNotFoundException {
2102     // Read in the Comparator and any hidden stuff
2103     s.defaultReadObject();
2104    
2105     // Read in size
2106     int size = s.readInt();
2107    
2108     buildFromSorted(size, null, s, null);
2109     }
2110    
2111     /** Intended to be called only from TreeSet.readObject **/
2112     void readTreeSet(int size, java.io.ObjectInputStream s, V defaultVal)
2113     throws java.io.IOException, ClassNotFoundException {
2114     buildFromSorted(size, null, s, defaultVal);
2115     }
2116    
2117     /** Intended to be called only from TreeSet.addAll **/
2118     void addAllForTreeSet(SortedSet<Map.Entry<K,V>> set, V defaultVal) {
2119     try {
2120     buildFromSorted(set.size(), set.iterator(), null, defaultVal);
2121     } catch (java.io.IOException cannotHappen) {
2122     } catch (ClassNotFoundException cannotHappen) {
2123     }
2124     }
2125    
2126    
2127     /**
2128     * Linear time tree building algorithm from sorted data. Can accept keys
2129     * and/or values from iterator or stream. This leads to too many
2130     * parameters, but seems better than alternatives. The four formats
2131     * that this method accepts are:
2132     *
2133     * 1) An iterator of Map.Entries. (it != null, defaultVal == null).
2134     * 2) An iterator of keys. (it != null, defaultVal != null).
2135     * 3) A stream of alternating serialized keys and values.
2136     * (it == null, defaultVal == null).
2137     * 4) A stream of serialized keys. (it == null, defaultVal != null).
2138     *
2139     * It is assumed that the comparator of the TreeMap is already set prior
2140     * to calling this method.
2141     *
2142     * @param size the number of keys (or key-value pairs) to be read from
2143     * the iterator or stream.
2144     * @param it If non-null, new entries are created from entries
2145     * or keys read from this iterator.
2146     * @param str If non-null, new entries are created from keys and
2147     * possibly values read from this stream in serialized form.
2148     * Exactly one of it and str should be non-null.
2149     * @param defaultVal if non-null, this default value is used for
2150     * each value in the map. If null, each value is read from
2151     * iterator or stream, as described above.
2152     * @throws IOException propagated from stream reads. This cannot
2153     * occur if str is null.
2154     * @throws ClassNotFoundException propagated from readObject.
2155     * This cannot occur if str is null.
2156     */
2157     private
2158     void buildFromSorted(int size, Iterator it,
2159     java.io.ObjectInputStream str,
2160     V defaultVal)
2161     throws java.io.IOException, ClassNotFoundException {
2162     this.size = size;
2163     root =
2164     buildFromSorted(0, 0, size-1, computeRedLevel(size),
2165     it, str, defaultVal);
2166     }
2167    
2168     /**
2169     * Recursive "helper method" that does the real work of the
2170     * of the previous method. Identically named parameters have
2171     * identical definitions. Additional parameters are documented below.
2172     * It is assumed that the comparator and size fields of the TreeMap are
2173     * already set prior to calling this method. (It ignores both fields.)
2174     *
2175     * @param level the current level of tree. Initial call should be 0.
2176     * @param lo the first element index of this subtree. Initial should be 0.
2177     * @param hi the last element index of this subtree. Initial should be
2178     * size-1.
2179     * @param redLevel the level at which nodes should be red.
2180     * Must be equal to computeRedLevel for tree of this size.
2181     */
2182     private final Entry<K,V> buildFromSorted(int level, int lo, int hi,
2183     int redLevel,
2184     Iterator it,
2185     java.io.ObjectInputStream str,
2186     V defaultVal)
2187     throws java.io.IOException, ClassNotFoundException {
2188     /*
2189     * Strategy: The root is the middlemost element. To get to it, we
2190     * have to first recursively construct the entire left subtree,
2191     * so as to grab all of its elements. We can then proceed with right
2192     * subtree.
2193     *
2194     * The lo and hi arguments are the minimum and maximum
2195     * indices to pull out of the iterator or stream for current subtree.
2196     * They are not actually indexed, we just proceed sequentially,
2197     * ensuring that items are extracted in corresponding order.
2198     */
2199    
2200     if (hi < lo) return null;
2201    
2202     int mid = (lo + hi) / 2;
2203    
2204     Entry<K,V> left = null;
2205     if (lo < mid)
2206     left = buildFromSorted(level+1, lo, mid - 1, redLevel,
2207     it, str, defaultVal);
2208    
2209     // extract key and/or value from iterator or stream
2210     K key;
2211     V value;
2212     if (it != null) {
2213     if (defaultVal==null) {
2214     Map.Entry<K,V> entry = (Map.Entry<K,V>)it.next();
2215     key = entry.getKey();
2216     value = entry.getValue();
2217     } else {
2218     key = (K)it.next();
2219     value = defaultVal;
2220     }
2221     } else { // use stream
2222     key = (K) str.readObject();
2223     value = (defaultVal != null ? defaultVal : (V) str.readObject());
2224     }
2225    
2226     Entry<K,V> middle = new Entry<K,V>(key, value, null);
2227    
2228     // color nodes in non-full bottommost level red
2229     if (level == redLevel)
2230     middle.color = RED;
2231    
2232     if (left != null) {
2233     middle.left = left;
2234     left.parent = middle;
2235     }
2236    
2237     if (mid < hi) {
2238     Entry<K,V> right = buildFromSorted(level+1, mid+1, hi, redLevel,
2239     it, str, defaultVal);
2240     middle.right = right;
2241     right.parent = middle;
2242     }
2243    
2244     return middle;
2245     }
2246    
2247     /**
2248     * Find the level down to which to assign all nodes BLACK. This is the
2249     * last `full' level of the complete binary tree produced by
2250     * buildTree. The remaining nodes are colored RED. (This makes a `nice'
2251     * set of color assignments wrt future insertions.) This level number is
2252     * computed by finding the number of splits needed to reach the zeroeth
2253     * node. (The answer is ~lg(N), but in any case must be computed by same
2254     * quick O(lg(N)) loop.)
2255     */
2256     private static int computeRedLevel(int sz) {
2257     int level = 0;
2258     for (int m = sz - 1; m >= 0; m = m / 2 - 1)
2259     level++;
2260     return level;
2261     }
2262    
2263     }