1 /*
   2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   3  *
   4  * This code is free software; you can redistribute it and/or modify it
   5  * under the terms of the GNU General Public License version 2 only, as
   6  * published by the Free Software Foundation.  Oracle designates this
   7  * particular file as subject to the "Classpath" exception as provided
   8  * by Oracle in the LICENSE file that accompanied this code.
   9  *
  10  * This code is distributed in the hope that it will be useful, but WITHOUT
  11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  13  * version 2 for more details (a copy is included in the LICENSE file that
  14  * accompanied this code).
  15  *
  16  * You should have received a copy of the GNU General Public License version
  17  * 2 along with this work; if not, write to the Free Software Foundation,
  18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  19  *
  20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  21  * or visit www.oracle.com if you need additional information or have any
  22  * questions.
  23  */
  24 
  25 /*
  26  * This file is available under and governed by the GNU General Public
  27  * License version 2 only, as published by the Free Software Foundation.
  28  * However, the following notice accompanied the original version of this
  29  * file:
  30  *
  31  * Written by Doug Lea and Josh Bloch with assistance from members of JCP
  32  * JSR-166 Expert Group and released to the public domain, as explained at
  33  * http://creativecommons.org/publicdomain/zero/1.0/
  34  */
  35 
  36 package java.util;
  37 
  38 /**
  39  * A {@link SortedMap} extended with navigation methods returning the
  40  * closest matches for given search targets. Methods
  41  * {@link #lowerEntry}, {@link #floorEntry}, {@link #ceilingEntry},
  42  * and {@link #higherEntry} return {@code Map.Entry} objects
  43  * associated with keys respectively less than, less than or equal,
  44  * greater than or equal, and greater than a given key, returning
  45  * {@code null} if there is no such key.  Similarly, methods
  46  * {@link #lowerKey}, {@link #floorKey}, {@link #ceilingKey}, and
  47  * {@link #higherKey} return only the associated keys. All of these
  48  * methods are designed for locating, not traversing entries.
  49  *
  50  * <p>A {@code NavigableMap} may be accessed and traversed in either
  51  * ascending or descending key order.  The {@link #descendingMap}
  52  * method returns a view of the map with the senses of all relational
  53  * and directional methods inverted. The performance of ascending
  54  * operations and views is likely to be faster than that of descending
  55  * ones.  Methods
  56  * {@link #subMap(Object, boolean, Object, boolean) subMap(K, boolean, K, boolean)},
  57  * {@link #headMap(Object, boolean) headMap(K, boolean)}, and
  58  * {@link #tailMap(Object, boolean) tailMap(K, boolean)}
  59  * differ from the like-named {@code SortedMap} methods in accepting
  60  * additional arguments describing whether lower and upper bounds are
  61  * inclusive versus exclusive.  Submaps of any {@code NavigableMap}
  62  * must implement the {@code NavigableMap} interface.
  63  *
  64  * <p>This interface additionally defines methods {@link #firstEntry},
  65  * {@link #pollFirstEntry}, {@link #lastEntry}, and
  66  * {@link #pollLastEntry} that return and/or remove the least and
  67  * greatest mappings, if any exist, else returning {@code null}.
  68  *
  69  * <p>Implementations of entry-returning methods are expected to
  70  * return {@code Map.Entry} pairs representing snapshots of mappings
  71  * at the time they were produced, and thus generally do <em>not</em>
  72  * support the optional {@code Entry.setValue} method. Note however
  73  * that it is possible to change mappings in the associated map using
  74  * method {@code put}.
  75  *
  76  * <p>Methods
  77  * {@link #subMap(Object, Object) subMap(K, K)},
  78  * {@link #headMap(Object) headMap(K)}, and
  79  * {@link #tailMap(Object) tailMap(K)}
  80  * are specified to return {@code SortedMap} to allow existing
  81  * implementations of {@code SortedMap} to be compatibly retrofitted to
  82  * implement {@code NavigableMap}, but extensions and implementations
  83  * of this interface are encouraged to override these methods to return
  84  * {@code NavigableMap}.  Similarly,
  85  * {@link #keySet()} can be overridden to return {@link NavigableSet}.
  86  *
  87  * <p>This interface is a member of the
  88  * <a href="{@docRoot}/java.base/java/util/package-summary.html#CollectionsFramework">
  89  * Java Collections Framework</a>.
  90  *
  91  * @author Doug Lea
  92  * @author Josh Bloch
  93  * @param <K> the type of keys maintained by this map
  94  * @param <V> the type of mapped values
  95  * @since 1.6
  96  */
  97 public interface NavigableMap<K,V> extends SortedMap<K,V> {
  98     /**
  99      * Returns a key-value mapping associated with the greatest key
 100      * strictly less than the given key, or {@code null} if there is
 101      * no such key.
 102      *
 103      * @param key the key
 104      * @return an entry with the greatest key less than {@code key},
 105      *         or {@code null} if there is no such key
 106      * @throws ClassCastException if the specified key cannot be compared
 107      *         with the keys currently in the map
 108      * @throws NullPointerException if the specified key is null
 109      *         and this map does not permit null keys
 110      */
 111     Map.Entry<K,V> lowerEntry(K key);
 112 
 113     /**
 114      * Returns the greatest key strictly less than the given key, or
 115      * {@code null} if there is no such key.
 116      *
 117      * @param key the key
 118      * @return the greatest key less than {@code key},
 119      *         or {@code null} if there is no such key
 120      * @throws ClassCastException if the specified key cannot be compared
 121      *         with the keys currently in the map
 122      * @throws NullPointerException if the specified key is null
 123      *         and this map does not permit null keys
 124      */
 125     K lowerKey(K key);
 126 
 127     /**
 128      * Returns a key-value mapping associated with the greatest key
 129      * less than or equal to the given key, or {@code null} if there
 130      * is no such key.
 131      *
 132      * @param key the key
 133      * @return an entry with the greatest key less than or equal to
 134      *         {@code key}, or {@code null} if there is no such key
 135      * @throws ClassCastException if the specified key cannot be compared
 136      *         with the keys currently in the map
 137      * @throws NullPointerException if the specified key is null
 138      *         and this map does not permit null keys
 139      */
 140     Map.Entry<K,V> floorEntry(K key);
 141 
 142     /**
 143      * Returns the greatest key less than or equal to the given key,
 144      * or {@code null} if there is no such key.
 145      *
 146      * @param key the key
 147      * @return the greatest key less than or equal to {@code key},
 148      *         or {@code null} if there is no such key
 149      * @throws ClassCastException if the specified key cannot be compared
 150      *         with the keys currently in the map
 151      * @throws NullPointerException if the specified key is null
 152      *         and this map does not permit null keys
 153      */
 154     K floorKey(K key);
 155 
 156     /**
 157      * Returns a key-value mapping associated with the least key
 158      * greater than or equal to the given key, or {@code null} if
 159      * there is no such key.
 160      *
 161      * @param key the key
 162      * @return an entry with the least key greater than or equal to
 163      *         {@code key}, or {@code null} if there is no such key
 164      * @throws ClassCastException if the specified key cannot be compared
 165      *         with the keys currently in the map
 166      * @throws NullPointerException if the specified key is null
 167      *         and this map does not permit null keys
 168      */
 169     Map.Entry<K,V> ceilingEntry(K key);
 170 
 171     /**
 172      * Returns the least key greater than or equal to the given key,
 173      * or {@code null} if there is no such key.
 174      *
 175      * @param key the key
 176      * @return the least key greater than or equal to {@code key},
 177      *         or {@code null} if there is no such key
 178      * @throws ClassCastException if the specified key cannot be compared
 179      *         with the keys currently in the map
 180      * @throws NullPointerException if the specified key is null
 181      *         and this map does not permit null keys
 182      */
 183     K ceilingKey(K key);
 184 
 185     /**
 186      * Returns a key-value mapping associated with the least key
 187      * strictly greater than the given key, or {@code null} if there
 188      * is no such key.
 189      *
 190      * @param key the key
 191      * @return an entry with the least key greater than {@code key},
 192      *         or {@code null} if there is no such key
 193      * @throws ClassCastException if the specified key cannot be compared
 194      *         with the keys currently in the map
 195      * @throws NullPointerException if the specified key is null
 196      *         and this map does not permit null keys
 197      */
 198     Map.Entry<K,V> higherEntry(K key);
 199 
 200     /**
 201      * Returns the least key strictly greater than the given key, or
 202      * {@code null} if there is no such key.
 203      *
 204      * @param key the key
 205      * @return the least key greater than {@code key},
 206      *         or {@code null} if there is no such key
 207      * @throws ClassCastException if the specified key cannot be compared
 208      *         with the keys currently in the map
 209      * @throws NullPointerException if the specified key is null
 210      *         and this map does not permit null keys
 211      */
 212     K higherKey(K key);
 213 
 214     /**
 215      * Returns a key-value mapping associated with the least
 216      * key in this map, or {@code null} if the map is empty.
 217      *
 218      * @return an entry with the least key,
 219      *         or {@code null} if this map is empty
 220      */
 221     Map.Entry<K,V> firstEntry();
 222 
 223     /**
 224      * Returns a key-value mapping associated with the greatest
 225      * key in this map, or {@code null} if the map is empty.
 226      *
 227      * @return an entry with the greatest key,
 228      *         or {@code null} if this map is empty
 229      */
 230     Map.Entry<K,V> lastEntry();
 231 
 232     /**
 233      * Removes and returns a key-value mapping associated with
 234      * the least key in this map, or {@code null} if the map is empty.
 235      *
 236      * @return the removed first entry of this map,
 237      *         or {@code null} if this map is empty
 238      */
 239     Map.Entry<K,V> pollFirstEntry();
 240 
 241     /**
 242      * Removes and returns a key-value mapping associated with
 243      * the greatest key in this map, or {@code null} if the map is empty.
 244      *
 245      * @return the removed last entry of this map,
 246      *         or {@code null} if this map is empty
 247      */
 248     Map.Entry<K,V> pollLastEntry();
 249 
 250     /**
 251      * Returns a reverse order view of the mappings contained in this map.
 252      * The descending map is backed by this map, so changes to the map are
 253      * reflected in the descending map, and vice-versa.  If either map is
 254      * modified while an iteration over a collection view of either map
 255      * is in progress (except through the iterator's own {@code remove}
 256      * operation), the results of the iteration are undefined.
 257      *
 258      * <p>The returned map has an ordering equivalent to
 259      * {@link Collections#reverseOrder(Comparator) Collections.reverseOrder}{@code (comparator())}.
 260      * The expression {@code m.descendingMap().descendingMap()} returns a
 261      * view of {@code m} essentially equivalent to {@code m}.
 262      *
 263      * @return a reverse order view of this map
 264      */
 265     NavigableMap<K,V> descendingMap();
 266 
 267     /**
 268      * Returns a {@link NavigableSet} view of the keys contained in this map.
 269      * The set's iterator returns the keys in ascending order.
 270      * The set is backed by the map, so changes to the map are reflected in
 271      * the set, and vice-versa.  If the map is modified while an iteration
 272      * over the set is in progress (except through the iterator's own {@code
 273      * remove} operation), the results of the iteration are undefined.  The
 274      * set supports element removal, which removes the corresponding mapping
 275      * from the map, via the {@code Iterator.remove}, {@code Set.remove},
 276      * {@code removeAll}, {@code retainAll}, and {@code clear} operations.
 277      * It does not support the {@code add} or {@code addAll} operations.
 278      *
 279      * @return a navigable set view of the keys in this map
 280      */
 281     NavigableSet<K> navigableKeySet();
 282 
 283     /**
 284      * Returns a reverse order {@link NavigableSet} view of the keys contained in this map.
 285      * The set's iterator returns the keys in descending order.
 286      * The set is backed by the map, so changes to the map are reflected in
 287      * the set, and vice-versa.  If the map is modified while an iteration
 288      * over the set is in progress (except through the iterator's own {@code
 289      * remove} operation), the results of the iteration are undefined.  The
 290      * set supports element removal, which removes the corresponding mapping
 291      * from the map, via the {@code Iterator.remove}, {@code Set.remove},
 292      * {@code removeAll}, {@code retainAll}, and {@code clear} operations.
 293      * It does not support the {@code add} or {@code addAll} operations.
 294      *
 295      * @return a reverse order navigable set view of the keys in this map
 296      */
 297     NavigableSet<K> descendingKeySet();
 298 
 299     /**
 300      * Returns a view of the portion of this map whose keys range from
 301      * {@code fromKey} to {@code toKey}.  If {@code fromKey} and
 302      * {@code toKey} are equal, the returned map is empty unless
 303      * {@code fromInclusive} and {@code toInclusive} are both true.  The
 304      * returned map is backed by this map, so changes in the returned map are
 305      * reflected in this map, and vice-versa.  The returned map supports all
 306      * optional map operations that this map supports.
 307      *
 308      * <p>The returned map will throw an {@code IllegalArgumentException}
 309      * on an attempt to insert a key outside of its range, or to construct a
 310      * submap either of whose endpoints lie outside its range.
 311      *
 312      * @param fromKey low endpoint of the keys in the returned map
 313      * @param fromInclusive {@code true} if the low endpoint
 314      *        is to be included in the returned view
 315      * @param toKey high endpoint of the keys in the returned map
 316      * @param toInclusive {@code true} if the high endpoint
 317      *        is to be included in the returned view
 318      * @return a view of the portion of this map whose keys range from
 319      *         {@code fromKey} to {@code toKey}
 320      * @throws ClassCastException if {@code fromKey} and {@code toKey}
 321      *         cannot be compared to one another using this map's comparator
 322      *         (or, if the map has no comparator, using natural ordering).
 323      *         Implementations may, but are not required to, throw this
 324      *         exception if {@code fromKey} or {@code toKey}
 325      *         cannot be compared to keys currently in the map.
 326      * @throws NullPointerException if {@code fromKey} or {@code toKey}
 327      *         is null and this map does not permit null keys
 328      * @throws IllegalArgumentException if {@code fromKey} is greater than
 329      *         {@code toKey}; or if this map itself has a restricted
 330      *         range, and {@code fromKey} or {@code toKey} lies
 331      *         outside the bounds of the range
 332      */
 333     NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive,
 334                              K toKey,   boolean toInclusive);
 335 
 336     /**
 337      * Returns a view of the portion of this map whose keys are less than (or
 338      * equal to, if {@code inclusive} is true) {@code toKey}.  The returned
 339      * map is backed by this map, so changes in the returned map are reflected
 340      * in this map, and vice-versa.  The returned map supports all optional
 341      * map operations that this map supports.
 342      *
 343      * <p>The returned map will throw an {@code IllegalArgumentException}
 344      * on an attempt to insert a key outside its range.
 345      *
 346      * @param toKey high endpoint of the keys in the returned map
 347      * @param inclusive {@code true} if the high endpoint
 348      *        is to be included in the returned view
 349      * @return a view of the portion of this map whose keys are less than
 350      *         (or equal to, if {@code inclusive} is true) {@code toKey}
 351      * @throws ClassCastException if {@code toKey} is not compatible
 352      *         with this map's comparator (or, if the map has no comparator,
 353      *         if {@code toKey} does not implement {@link Comparable}).
 354      *         Implementations may, but are not required to, throw this
 355      *         exception if {@code toKey} cannot be compared to keys
 356      *         currently in the map.
 357      * @throws NullPointerException if {@code toKey} is null
 358      *         and this map does not permit null keys
 359      * @throws IllegalArgumentException if this map itself has a
 360      *         restricted range, and {@code toKey} lies outside the
 361      *         bounds of the range
 362      */
 363     NavigableMap<K,V> headMap(K toKey, boolean inclusive);
 364 
 365     /**
 366      * Returns a view of the portion of this map whose keys are greater than (or
 367      * equal to, if {@code inclusive} is true) {@code fromKey}.  The returned
 368      * map is backed by this map, so changes in the returned map are reflected
 369      * in this map, and vice-versa.  The returned map supports all optional
 370      * map operations that this map supports.
 371      *
 372      * <p>The returned map will throw an {@code IllegalArgumentException}
 373      * on an attempt to insert a key outside its range.
 374      *
 375      * @param fromKey low endpoint of the keys in the returned map
 376      * @param inclusive {@code true} if the low endpoint
 377      *        is to be included in the returned view
 378      * @return a view of the portion of this map whose keys are greater than
 379      *         (or equal to, if {@code inclusive} is true) {@code fromKey}
 380      * @throws ClassCastException if {@code fromKey} is not compatible
 381      *         with this map's comparator (or, if the map has no comparator,
 382      *         if {@code fromKey} does not implement {@link Comparable}).
 383      *         Implementations may, but are not required to, throw this
 384      *         exception if {@code fromKey} cannot be compared to keys
 385      *         currently in the map.
 386      * @throws NullPointerException if {@code fromKey} is null
 387      *         and this map does not permit null keys
 388      * @throws IllegalArgumentException if this map itself has a
 389      *         restricted range, and {@code fromKey} lies outside the
 390      *         bounds of the range
 391      */
 392     NavigableMap<K,V> tailMap(K fromKey, boolean inclusive);
 393 
 394     /**
 395      * {@inheritDoc}
 396      *
 397      * <p>Equivalent to {@code subMap(fromKey, true, toKey, false)}.
 398      *
 399      * @throws ClassCastException       {@inheritDoc}
 400      * @throws NullPointerException     {@inheritDoc}
 401      * @throws IllegalArgumentException {@inheritDoc}
 402      */
 403     SortedMap<K,V> subMap(K fromKey, K toKey);
 404 
 405     /**
 406      * {@inheritDoc}
 407      *
 408      * <p>Equivalent to {@code headMap(toKey, false)}.
 409      *
 410      * @throws ClassCastException       {@inheritDoc}
 411      * @throws NullPointerException     {@inheritDoc}
 412      * @throws IllegalArgumentException {@inheritDoc}
 413      */
 414     SortedMap<K,V> headMap(K toKey);
 415 
 416     /**
 417      * {@inheritDoc}
 418      *
 419      * <p>Equivalent to {@code tailMap(fromKey, true)}.
 420      *
 421      * @throws ClassCastException       {@inheritDoc}
 422      * @throws NullPointerException     {@inheritDoc}
 423      * @throws IllegalArgumentException {@inheritDoc}
 424      */
 425     SortedMap<K,V> tailMap(K fromKey);
 426 }