View Javadoc
1   package org.djutils.immutablecollections;
2   
3   import java.util.Comparator;
4   import java.util.NoSuchElementException;
5   import java.util.SortedMap;
6   import java.util.TreeMap;
7   
8   /**
9    * A SortedMap interface without the methods that can change it. The return values of subMap, tailMap and headMap are all
10   * ImmutableSortedMaps.
11   * <p>
12   * Copyright (c) 2016-2024 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights reserved. See
13   * for project information <a href="https://djutils.org" target="_blank"> https://djutils.org</a>. The DJUTILS project is
14   * distributed under a three-clause BSD-style license, which can be found at
15   * <a href="https://djutils.org/docs/license.html" target="_blank"> https://djutils.org/docs/license.html</a>.
16   * </p>
17   * @author <a href="https://www.tudelft.nl/averbraeck">Alexander Verbraeck</a>
18   * @author <a href="https://www.tudelft.nl/staff/p.knoppers/">Peter Knoppers</a>
19   * @param <K> the key type of content of this Map
20   * @param <V> the value type of content of this Map
21   */
22  public interface ImmutableSortedMap<K, V> extends ImmutableMap<K, V>
23  {
24      /**
25       * Returns a modifiable copy of this immutable map.
26       * @return a modifiable copy of this immutable map.
27       */
28      @Override
29      SortedMap<K, V> toMap();
30  
31      /**
32       * Returns the comparator used to order the keys in this immutable map, or <code>null</code> if this immutable map uses the
33       * {@linkplain Comparable natural ordering} of its keys.
34       * @return the comparator used to order the keys in this immutable map, or <code>null</code> if this immutable map uses the
35       *         natural ordering of its keys
36       */
37      Comparator<? super K> comparator();
38  
39      /**
40       * Returns a view of the portion of this immutable map whose keys range from <code>fromKey</code>, inclusive, to
41       * <code>toKey</code>, exclusive. (If <code>fromKey</code> and <code>toKey</code> are equal, the returned immutable map is
42       * empty.)
43       * <p>
44       * The result of this method is a new, immutable sorted map.
45       * @param fromKey K; low endpoint (inclusive) of the returned immutable map
46       * @param toKey K; high endpoint (exclusive) of the returned immutable map
47       * @return a new, immutable sorted map of the portion of this immutable map whose keys range from <code>fromKey</code>,
48       *         inclusive, to <code>toKey</code>, exclusive
49       * @throws ClassCastException if <code>fromKey</code> and <code>toKey</code> cannot be compared to one another using this
50       *             immutable map's comparator (or, if the immutable map has no comparator, using natural ordering).
51       *             Implementations may, but are not required to, throw this exception if <code>fromKey</code> or
52       *             <code>toKey</code> cannot be compared to keys currently in the immutable map.
53       * @throws NullPointerException if <code>fromKey</code> or <code>toKey</code> is null and this immutable map does not permit
54       *             null keys
55       * @throws IllegalArgumentException if <code>fromKey</code> is greater than <code>toKey</code>; or if this immutable map
56       *             itself has a restricted range, and <code>fromKey</code> or <code>toKey</code> lies outside the bounds of the
57       *             range
58       */
59      ImmutableSortedMap<K, V> subMap(K fromKey, K toKey);
60  
61      /**
62       * Returns a view of the portion of this immutable map whose keys are strictly less than <code>toKey</code>. The returned
63       * immutable map is backed by this immutable map, so changes in the returned immutable map are reflected in this immutable
64       * map, and vice-versa. The returned immutable map supports all optional immutable map operations that this immutable map
65       * supports.
66       * <p>
67       * The result of this method is a new, immutable sorted map.
68       * @param toKey K; high endpoint (exclusive) of the returned immutable map
69       * @return a view of the portion of this immutable map whose keys are strictly less than <code>toKey</code>
70       * @throws ClassCastException if <code>toKey</code> is not compatible with this immutable map's comparator (or, if the
71       *             immutable map has no comparator, if <code>toKey</code> does not implement {@link Comparable}).
72       *             Implementations may, but are not required to, throw this exception if <code>toKey</code> cannot be compared
73       *             to keys currently in the immutable map.
74       * @throws NullPointerException if <code>toKey</code> is null and this immutable map does not permit null keys
75       * @throws IllegalArgumentException if this immutable map itself has a restricted range, and <code>toKey</code> lies outside
76       *             the bounds of the range
77       */
78      ImmutableSortedMap<K, V> headMap(K toKey);
79  
80      /**
81       * Returns a view of the portion of this immutable map whose keys are greater than or equal to <code>fromKey</code>. The
82       * returned immutable map is backed by this immutable map, so changes in the returned immutable map are reflected in this
83       * immutable map, and vice-versa. The returned immutable map supports all optional immutable map operations that this
84       * immutable map supports.
85       * <p>
86       * The result of this method is a new, immutable sorted map.
87       * @param fromKey K; low endpoint (inclusive) of the returned immutable map
88       * @return a view of the portion of this immutable map whose keys are greater than or equal to <code>fromKey</code>
89       * @throws ClassCastException if <code>fromKey</code> is not compatible with this immutable map's comparator (or, if the
90       *             immutable map has no comparator, if <code>fromKey</code> does not implement {@link Comparable}).
91       *             Implementations may, but are not required to, throw this exception if <code>fromKey</code> cannot be compared
92       *             to keys currently in the immutable map.
93       * @throws NullPointerException if <code>fromKey</code> is null and this immutable map does not permit null keys
94       * @throws IllegalArgumentException if this immutable map itself has a restricted range, and <code>fromKey</code> lies
95       *             outside the bounds of the range
96       */
97      ImmutableSortedMap<K, V> tailMap(K fromKey);
98  
99      /**
100      * Returns the first (lowest) key currently in this immutable map.
101      * @return the first (lowest) key currently in this immutable map
102      * @throws NoSuchElementException if this immutable map is empty
103      */
104     K firstKey();
105 
106     /**
107      * Returns the last (highest) key currently in this immutable map.
108      * @return the last (highest) key currently in this immutable map
109      * @throws NoSuchElementException if this immutable map is empty
110      */
111     K lastKey();
112 
113     /**
114      * Return an ImmutableSortedSet view of the keys contained in this immutable map.
115      * @return an ImmutableSortedSet view of the keys contained in this immutable map
116      */
117     @Override
118     ImmutableSortedSet<K> keySet();
119 
120     /**
121      * Force to redefine equals for the implementations of immutable collection classes.
122      * @param obj Object; the object to compare this collection with
123      * @return whether the objects are equal
124      */
125     @Override
126     boolean equals(Object obj);
127 
128     /**
129      * Force to redefine hashCode for the implementations of immutable collection classes.
130      * @return the calculated hashCode
131      */
132     @Override
133     int hashCode();
134 
135     /**
136      * Return an empty ImmutableSortedMap, backed by a TreeMap.
137      * @param <K> the key type
138      * @param <V> the value type
139      * @return ImmutableSortedMap&lt;K, V&gt;; an empty ImmutableSortedMap
140      */
141     static <K, V> ImmutableSortedMap<K, V> of()
142     {
143         return new ImmutableTreeMap<>(new TreeMap<K, V>(), Immutable.WRAP);
144     }
145 
146     /**
147      * Return an ImmutableSortedMap with 1 entry, backed by a TreeMap.
148      * @param <K> the key type
149      * @param <V> the value type
150      * @param k1 K; key 1
151      * @param v1 V; value 1
152      * @return ImmutableSortedMap&lt;K, V&gt;; an ImmutableSortedMap with 1 entry, backed by a TreeMap
153      */
154     static <K, V> ImmutableSortedMap<K, V> of(final K k1, final V v1)
155     {
156         TreeMap<K, V> map = new TreeMap<>();
157         map.put(k1, v1);
158         return new ImmutableTreeMap<>(map, Immutable.WRAP);
159     }
160 
161     /**
162      * Return an ImmutableSortedMap with 2 entries, backed by a TreeMap.
163      * @param <K> the key type
164      * @param <V> the value type
165      * @param k1 K; key 1
166      * @param v1 V; value 1
167      * @param k2 K; key 2
168      * @param v2 V; value 2
169      * @return ImmutableSortedMap&lt;K, V&gt;; an ImmutableSortedMap with 2 entries, backed by a TreeMap
170      */
171     static <K, V> ImmutableSortedMap<K, V> of(final K k1, final V v1, final K k2, final V v2)
172     {
173         TreeMap<K, V> map = new TreeMap<>();
174         map.put(k1, v1);
175         map.put(k2, v2);
176         return new ImmutableTreeMap<>(map, Immutable.WRAP);
177     }
178 
179     /**
180      * Return an ImmutableSortedMap with 3 entries, backed by a TreeMap.
181      * @param <K> the key type
182      * @param <V> the value type
183      * @param k1 K; key 1
184      * @param v1 V; value 1
185      * @param k2 K; key 2
186      * @param v2 V; value 2
187      * @param k3 K; key 3
188      * @param v3 V; value 3
189      * @return ImmutableSortedMap&lt;K, V&gt;; an ImmutableSortedMap with 3 entries, backed by a TreeMap
190      */
191     static <K, V> ImmutableSortedMap<K, V> of(final K k1, final V v1, final K k2, final V v2, final K k3, final V v3)
192     {
193         TreeMap<K, V> map = new TreeMap<>();
194         map.put(k1, v1);
195         map.put(k2, v2);
196         map.put(k3, v3);
197         return new ImmutableTreeMap<>(map, Immutable.WRAP);
198     }
199 
200     /**
201      * Return an ImmutableSortedMap with 4 entries, backed by a TreeMap.
202      * @param <K> the key type
203      * @param <V> the value type
204      * @param k1 K; key 1
205      * @param v1 V; value 1
206      * @param k2 K; key 2
207      * @param v2 V; value 2
208      * @param k3 K; key 3
209      * @param v3 V; value 3
210      * @param k4 K; key 4
211      * @param v4 V; value 4
212      * @return ImmutableSortedMap&lt;K, V&gt;; an ImmutableSortedMap with 4 entries, backed by a TreeMap
213      */
214     @SuppressWarnings("checkstyle:parameternumber")
215     static <K, V> ImmutableSortedMap<K, V> of(final K k1, final V v1, final K k2, final V v2, final K k3, final V v3,
216             final K k4, final V v4)
217     {
218         TreeMap<K, V> map = new TreeMap<>();
219         map.put(k1, v1);
220         map.put(k2, v2);
221         map.put(k3, v3);
222         map.put(k4, v4);
223         return new ImmutableTreeMap<>(map, Immutable.WRAP);
224     }
225 
226     /**
227      * Return an ImmutableSortedMap with 5 entries, backed by a TreeMap.
228      * @param <K> the key type
229      * @param <V> the value type
230      * @param k1 K; key 1
231      * @param v1 V; value 1
232      * @param k2 K; key 2
233      * @param v2 V; value 2
234      * @param k3 K; key 3
235      * @param v3 V; value 3
236      * @param k4 K; key 4
237      * @param v4 V; value 4
238      * @param k5 K; key 5
239      * @param v5 V; value 5
240      * @return ImmutableSortedMap&lt;K, V&gt;; an ImmutableSortedMap with 5 entries, backed by a TreeMap
241      */
242     @SuppressWarnings("checkstyle:parameternumber")
243     static <K, V> ImmutableSortedMap<K, V> of(final K k1, final V v1, final K k2, final V v2, final K k3, final V v3,
244             final K k4, final V v4, final K k5, final V v5)
245     {
246         TreeMap<K, V> map = new TreeMap<>();
247         map.put(k1, v1);
248         map.put(k2, v2);
249         map.put(k3, v3);
250         map.put(k4, v4);
251         map.put(k5, v5);
252         return new ImmutableTreeMap<>(map, Immutable.WRAP);
253     }
254 
255     /**
256      * Return an ImmutableSortedMap with 6 entries, backed by a TreeMap.
257      * @param <K> the key type
258      * @param <V> the value type
259      * @param k1 K; key 1
260      * @param v1 V; value 1
261      * @param k2 K; key 2
262      * @param v2 V; value 2
263      * @param k3 K; key 3
264      * @param v3 V; value 3
265      * @param k4 K; key 4
266      * @param v4 V; value 4
267      * @param k5 K; key 5
268      * @param v5 V; value 5
269      * @param k6 K; key 6
270      * @param v6 V; value 6
271      * @return ImmutableSortedMap&lt;K, V&gt;; an ImmutableSortedMap with 6 entries, backed by a TreeMap
272      */
273     @SuppressWarnings("checkstyle:parameternumber")
274     static <K, V> ImmutableSortedMap<K, V> of(final K k1, final V v1, final K k2, final V v2, final K k3, final V v3,
275             final K k4, final V v4, final K k5, final V v5, final K k6, final V v6)
276     {
277         TreeMap<K, V> map = new TreeMap<>();
278         map.put(k1, v1);
279         map.put(k2, v2);
280         map.put(k3, v3);
281         map.put(k4, v4);
282         map.put(k5, v5);
283         map.put(k6, v6);
284         return new ImmutableTreeMap<>(map, Immutable.WRAP);
285     }
286 
287     /**
288      * Return an ImmutableSortedMap with 7 entries, backed by a TreeMap.
289      * @param <K> the key type
290      * @param <V> the value type
291      * @param k1 K; key 1
292      * @param v1 V; value 1
293      * @param k2 K; key 2
294      * @param v2 V; value 2
295      * @param k3 K; key 3
296      * @param v3 V; value 3
297      * @param k4 K; key 4
298      * @param v4 V; value 4
299      * @param k5 K; key 5
300      * @param v5 V; value 5
301      * @param k6 K; key 6
302      * @param v6 V; value 6
303      * @param k7 K; key 7
304      * @param v7 V; value 7
305      * @return ImmutableSortedMap&lt;K, V&gt;; an ImmutableSortedMap with 7 entries, backed by a TreeMap
306      */
307     @SuppressWarnings("checkstyle:parameternumber")
308     static <K, V> ImmutableSortedMap<K, V> of(final K k1, final V v1, final K k2, final V v2, final K k3, final V v3,
309             final K k4, final V v4, final K k5, final V v5, final K k6, final V v6, final K k7, final V v7)
310     {
311         TreeMap<K, V> map = new TreeMap<>();
312         map.put(k1, v1);
313         map.put(k2, v2);
314         map.put(k3, v3);
315         map.put(k4, v4);
316         map.put(k5, v5);
317         map.put(k6, v6);
318         map.put(k7, v7);
319         return new ImmutableTreeMap<>(map, Immutable.WRAP);
320     }
321 
322     /**
323      * Return an ImmutableSortedMap with 8 entries, backed by a TreeMap.
324      * @param <K> the key type
325      * @param <V> the value type
326      * @param k1 K; key 1
327      * @param v1 V; value 1
328      * @param k2 K; key 2
329      * @param v2 V; value 2
330      * @param k3 K; key 3
331      * @param v3 V; value 3
332      * @param k4 K; key 4
333      * @param v4 V; value 4
334      * @param k5 K; key 5
335      * @param v5 V; value 5
336      * @param k6 K; key 6
337      * @param v6 V; value 6
338      * @param k7 K; key 7
339      * @param v7 V; value 7
340      * @param k8 K; key 8
341      * @param v8 V; value 8
342      * @return ImmutableSortedMap&lt;K, V&gt;; an ImmutableSortedMap with 8 entries, backed by a TreeMap
343      */
344     @SuppressWarnings("checkstyle:parameternumber")
345     static <K, V> ImmutableSortedMap<K, V> of(final K k1, final V v1, final K k2, final V v2, final K k3, final V v3,
346             final K k4, final V v4, final K k5, final V v5, final K k6, final V v6, final K k7, final V v7, final K k8,
347             final V v8)
348     {
349         TreeMap<K, V> map = new TreeMap<>();
350         map.put(k1, v1);
351         map.put(k2, v2);
352         map.put(k3, v3);
353         map.put(k4, v4);
354         map.put(k5, v5);
355         map.put(k6, v6);
356         map.put(k7, v7);
357         map.put(k8, v8);
358         return new ImmutableTreeMap<>(map, Immutable.WRAP);
359     }
360 
361 }