View Javadoc
1   package org.djutils.immutablecollections;
2   
3   import java.util.Collections;
4   import java.util.Comparator;
5   import java.util.NavigableMap;
6   
7   /**
8    * A {@link ImmutableSortedMap} extended with navigation methods reporting closest matches for given search targets. Methods
9    * {@code lowerKey}, {@code floorKey}, {@code ceilingKey}, and {@code higherKey} return keys respectively less than, less than
10   * or equal, greater than or equal, and greater than a given key, returning {@code null} if there is no such key. All methods
11   * from java.util.NavigableMap that can change the map have been left out.
12   * <p>
13   * Copyright (c) 2016-2024 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights reserved. See
14   * for project information <a href="https://djutils.org" target="_blank"> https://djutils.org</a>. The DJUTILS project is
15   * distributed under a three-clause BSD-style license, which can be found at
16   * <a href="https://djutils.org/docs/license.html" target="_blank"> https://djutils.org/docs/license.html</a>.
17   * </p>
18   * @author <a href="https://www.tudelft.nl/averbraeck">Alexander Verbraeck</a>
19   * @author <a href="https://www.tudelft.nl/staff/p.knoppers/">Peter Knoppers</a>
20   * @param <K> the key type of content of this Map
21   * @param <V> the value type of content of this Map
22   */
23  public interface ImmutableNavigableMap<K, V> extends ImmutableSortedMap<K, V>
24  {
25      /**
26       * Returns a modifiable copy of this immutable map.
27       * @return a modifiable copy of this immutable map.
28       */
29      @Override
30      NavigableMap<K, V> toMap();
31  
32      /**
33       * Returns a {@link ImmutableSortedSet} view of the keys contained in this map.
34       * @return an immutable sorted set of the keys contained in this map
35       */
36      @Override
37      ImmutableSortedSet<K> keySet();
38  
39      /**
40       * Returns the greatest key in this immutable map strictly less than the given key, or {@code null} if there is no such key.
41       * @param e K; the value to match
42       * @return the greatest key less than {@code e}, or {@code null} if there is no such key
43       * @throws ClassCastException if the specified key cannot be compared with the keys currently in the immutable map
44       * @throws NullPointerException if the specified key is null and this immutable map does not permit null keys
45       */
46      K lowerKey(K e);
47  
48      /**
49       * Returns the greatest key in this immutable map less than or equal to the given key, or {@code null} if there is no such
50       * key.
51       * @param e K; the value to match
52       * @return the greatest key less than or equal to {@code e}, or {@code null} if there is no such key
53       * @throws ClassCastException if the specified key cannot be compared with the keys currently in the immutable map
54       * @throws NullPointerException if the specified key is null and this immutable map does not permit null keys
55       */
56      K floorKey(K e);
57  
58      /**
59       * Returns the least key in this immutable map greater than or equal to the given key, or {@code null} if there is no such
60       * key.
61       * @param e K; the value to match
62       * @return the least key greater than or equal to {@code e}, or {@code null} if there is no such key
63       * @throws ClassCastException if the specified key cannot be compared with the keys currently in the immutable map
64       * @throws NullPointerException if the specified key is null and this immutable map does not permit null keys
65       */
66      K ceilingKey(K e);
67  
68      /**
69       * Returns the least key in this immutable map strictly greater than the given key, or {@code null} if there is no such key.
70       * @param e K; the value to match
71       * @return the least key greater than {@code e}, or {@code null} if there is no such key
72       * @throws ClassCastException if the specified key cannot be compared with the keys currently in the immutable map
73       * @throws NullPointerException if the specified key is null and this immutable map does not permit null keys
74       */
75      K higherKey(K e);
76  
77      /**
78       * Returns a reverse order view of the keys contained in this immutable map.
79       * <p>
80       * The returned immutable map has an ordering equivalent to
81       * <code>{@link Collections#reverseOrder(Comparator) Collections.reverseOrder}(comparator())</code>. The expression
82       * {@code s.descendingMap().descendingMap()} returns a view of {@code s} essentially equivalent to {@code s}.
83       * @return a reverse order view of this immutable map
84       */
85      ImmutableNavigableMap<K, V> descendingMap();
86  
87      /**
88       * Returns a view of the portion of this immutable map whose keys range from {@code fromKey} to {@code toKey}. If
89       * {@code fromKey} and {@code toKey} are equal, the returned immutable map is empty unless {@code fromInclusive} and
90       * {@code toInclusive} are both true.
91       * @param fromKey K; low endpoint of the returned immutable map
92       * @param fromInclusive boolean; {@code true} if the low endpoint is to be included in the returned view
93       * @param toKey K; high endpoint of the returned immutable map
94       * @param toInclusive boolean; {@code true} if the high endpoint is to be included in the returned view
95       * @return a view of the portion of this immutable map whose keys range from {@code fromKey}, inclusive, to {@code toKey},
96       *         exclusive
97       * @throws ClassCastException if {@code fromKey} and {@code toKey} cannot be compared to one another using this immutable
98       *             map's comparator (or, if the immutable map has no comparator, using natural ordering). Implementations may,
99       *             but are not required to, throw this exception if {@code fromKey} or {@code toKey} cannot be compared to keys
100      *             currently in the immutable map.
101      * @throws NullPointerException if {@code fromKey} or {@code toKey} is null and this immutable map does not permit null keys
102      * @throws IllegalArgumentException if {@code fromKey} is greater than {@code toKey}; or if this immutable map itself has a
103      *             restricted range, and {@code fromKey} or {@code toKey} lies outside the bounds of the range.
104      */
105     ImmutableNavigableMap<K, V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive);
106 
107     /**
108      * Returns a view of the portion of this immutable map whose keys are less than (or equal to, if {@code inclusive} is true)
109      * {@code toKey}.
110      * @param toKey K; high endpoint of the returned immutable map
111      * @param inclusive boolean; {@code true} if the high endpoint is to be included in the returned view
112      * @return a view of the portion of this immutable map whose keys are less than (or equal to, if {@code inclusive} is true)
113      *         {@code toKey}
114      * @throws ClassCastException if {@code toKey} is not compatible with this immutable map's comparator (or, if the immutable
115      *             map has no comparator, if {@code toKey} does not implement {@link Comparable}). Implementations may, but are
116      *             not required to, throw this exception if {@code toKey} cannot be compared to keys currently in the immutable
117      *             map.
118      * @throws NullPointerException if {@code toKey} is null and this immutable map does not permit null keys
119      * @throws IllegalArgumentException if this immutable map itself has a restricted range, and {@code toKey} lies outside the
120      *             bounds of the range
121      */
122     ImmutableNavigableMap<K, V> headMap(K toKey, boolean inclusive);
123 
124     /**
125      * Returns a view of the portion of this immutable map whose keys are greater than (or equal to, if {@code inclusive} is
126      * true) {@code fromKey}.
127      * @param fromKey K; low endpoint of the returned immutable map
128      * @param inclusive boolean; {@code true} if the low endpoint is to be included in the returned view
129      * @return a view of the portion of this immutable map whose keys are greater than or equal to {@code fromKey}
130      * @throws ClassCastException if {@code fromKey} is not compatible with this immutable map's comparator (or, if the
131      *             immutable map has no comparator, if {@code fromKey} does not implement {@link Comparable}). Implementations
132      *             may, but are not required to, throw this exception if {@code fromKey} cannot be compared to keys currently in
133      *             the immutable map.
134      * @throws NullPointerException if {@code fromKey} is null and this immutable map does not permit null keys
135      * @throws IllegalArgumentException if this immutable map itself has a restricted range, and {@code fromKey} lies outside
136      *             the bounds of the range
137      */
138     ImmutableNavigableMap<K, V> tailMap(K fromKey, boolean inclusive);
139 
140     /**
141      * Force to redefine equals for the implementations of immutable collection classes.
142      * @param obj Object; the object to compare this collection with
143      * @return whether the objects are equal
144      */
145     @Override
146     boolean equals(Object obj);
147 
148     /**
149      * Force to redefine hashCode for the implementations of immutable collection classes.
150      * @return the calculated hashCode
151      */
152     @Override
153     int hashCode();
154 
155 }