ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/main/java/util/TreeMap.java
Revision: 1.43
Committed: Sun May 20 07:54:01 2007 UTC (17 years ago) by jsr166
Branch: MAIN
Changes since 1.42: +21 -3 lines
Log Message:
License update

File Contents

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