1 package org.djutils.immutablecollections; 2 3 import java.util.Collections; 4 import java.util.Comparator; 5 import java.util.NavigableSet; 6 7 /** 8 * A {@link ImmutableSortedSet} extended with navigation methods reporting closest matches for given search targets. Methods 9 * {@code lower}, {@code floor}, {@code ceiling}, and {@code higher} return elements respectively less than, less than or equal, 10 * greater than or equal, and greater than a given element, returning {@code null} if there is no such element. All methods from 11 * java.util.NavigableSet that can change the set 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 <E> the type of content of this Set 21 */ 22 public interface ImmutableNavigableSet<E> extends ImmutableSortedSet<E> 23 { 24 /** 25 * Returns a modifiable copy of this immutable set. 26 * @return a modifiable copy of this immutable set. 27 */ 28 @Override 29 NavigableSet<E> toSet(); 30 31 /** 32 * Returns the greatest element in this immutable set strictly less than the given element, or {@code null} if there is no 33 * such element. 34 * @param e E; the value to match 35 * @return the greatest element less than {@code e}, or {@code null} if there is no such element 36 * @throws ClassCastException if the specified element cannot be compared with the elements currently in the immutable set 37 * @throws NullPointerException if the specified element is null and this immutable set does not permit null elements 38 */ 39 E lower(E e); 40 41 /** 42 * Returns the greatest element in this immutable set less than or equal to the given element, or {@code null} if there is 43 * no such element. 44 * @param e E; the value to match 45 * @return the greatest element less than or equal to {@code e}, or {@code null} if there is no such element 46 * @throws ClassCastException if the specified element cannot be compared with the elements currently in the immutable set 47 * @throws NullPointerException if the specified element is null and this immutable set does not permit null elements 48 */ 49 E floor(E e); 50 51 /** 52 * Returns the least element in this immutable set greater than or equal to the given element, or {@code null} if there is 53 * no such element. 54 * @param e E; the value to match 55 * @return the least element greater than or equal to {@code e}, or {@code null} if there is no such element 56 * @throws ClassCastException if the specified element cannot be compared with the elements currently in the immutable set 57 * @throws NullPointerException if the specified element is null and this immutable set does not permit null elements 58 */ 59 E ceiling(E e); 60 61 /** 62 * Returns the least element in this immutable set strictly greater than the given element, or {@code null} if there is no 63 * such element. 64 * @param e E; the value to match 65 * @return the least element greater than {@code e}, or {@code null} if there is no such element 66 * @throws ClassCastException if the specified element cannot be compared with the elements currently in the immutable set 67 * @throws NullPointerException if the specified element is null and this immutable set does not permit null elements 68 */ 69 E higher(E e); 70 71 /** 72 * Returns a reverse order view of the elements contained in this immutable set. 73 * <p> 74 * The returned immutable set has an ordering equivalent to 75 * <code>{@link Collections#reverseOrder(Comparator) Collections.reverseOrder}(comparator())</code>. The expression 76 * {@code s.descendingSet().descendingSet()} returns a view of {@code s} essentially equivalent to {@code s}. 77 * @return a reverse order view of this immutable set 78 */ 79 ImmutableNavigableSet<E> descendingSet(); 80 81 /** 82 * Returns an immutable iterator over the elements in this immutable set, in descending order. Equivalent in effect to 83 * {@code descendingSet().iterator()}. 84 * @return an immutable iterator over the elements in this immutable set, in descending order 85 */ 86 ImmutableIterator<E> descendingIterator(); 87 88 /** 89 * Returns a view of the portion of this immutable set whose elements range from {@code fromElement} to {@code toElement}. 90 * If {@code fromElement} and {@code toElement} are equal, the returned immutable set is empty unless {@code fromInclusive} 91 * and {@code toInclusive} are both true. 92 * @param fromElement E; low endpoint of the returned immutable set 93 * @param fromInclusive boolean; {@code true} if the low endpoint is to be included in the returned view 94 * @param toElement E; high endpoint of the returned immutable set 95 * @param toInclusive boolean; {@code true} if the high endpoint is to be included in the returned view 96 * @return a view of the portion of this immutable set whose elements range from {@code fromElement}, inclusive, to 97 * {@code toElement}, exclusive 98 * @throws ClassCastException if {@code fromElement} and {@code toElement} cannot be compared to one another using this 99 * immutable set's comparator (or, if the immutable set has no comparator, using natural ordering). 100 * Implementations may, but are not required to, throw this exception if {@code fromElement} or 101 * {@code toElement} cannot be compared to elements currently in the immutable set. 102 * @throws NullPointerException if {@code fromElement} or {@code toElement} is null and this immutable set does not permit 103 * null elements 104 * @throws IllegalArgumentException if {@code fromElement} is greater than {@code toElement}; or if this immutable set 105 * itself has a restricted range, and {@code fromElement} or {@code toElement} lies outside the bounds of the 106 * range. 107 */ 108 ImmutableNavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive); 109 110 /** 111 * Returns a view of the portion of this immutable set whose elements are less than (or equal to, if {@code inclusive} is 112 * true) {@code toElement}. 113 * @param toElement E; high endpoint of the returned immutable set 114 * @param inclusive boolean; {@code true} if the high endpoint is to be included in the returned view 115 * @return a view of the portion of this immutable set whose elements are less than (or equal to, if {@code inclusive} is 116 * true) {@code toElement} 117 * @throws ClassCastException if {@code toElement} is not compatible with this immutable set's comparator (or, if the 118 * immutable set has no comparator, if {@code toElement} does not implement {@link Comparable}). Implementations 119 * may, but are not required to, throw this exception if {@code toElement} cannot be compared to elements 120 * currently in the immutable set. 121 * @throws NullPointerException if {@code toElement} is null and this immutable set does not permit null elements 122 * @throws IllegalArgumentException if this immutable set itself has a restricted range, and {@code toElement} lies outside 123 * the bounds of the range 124 */ 125 ImmutableNavigableSet<E> headSet(E toElement, boolean inclusive); 126 127 /** 128 * Returns a view of the portion of this immutable set whose elements are greater than (or equal to, if {@code inclusive} is 129 * true) {@code fromElement}. 130 * @param fromElement E; low endpoint of the returned immutable set 131 * @param inclusive boolean; {@code true} if the low endpoint is to be included in the returned view 132 * @return a view of the portion of this immutable set whose elements are greater than or equal to {@code fromElement} 133 * @throws ClassCastException if {@code fromElement} is not compatible with this immutable set's comparator (or, if the 134 * immutable set has no comparator, if {@code fromElement} does not implement {@link Comparable}). 135 * Implementations may, but are not required to, throw this exception if {@code fromElement} cannot be compared 136 * to elements currently in the immutable set. 137 * @throws NullPointerException if {@code fromElement} is null and this immutable set does not permit null elements 138 * @throws IllegalArgumentException if this immutable set itself has a restricted range, and {@code fromElement} lies 139 * outside the bounds of the range 140 */ 141 ImmutableNavigableSet<E> tailSet(E fromElement, boolean inclusive); 142 143 /** 144 * Force to redefine equals for the implementations of immutable collection classes. 145 * @param obj Object; the object to compare this collection with 146 * @return whether the objects are equal 147 */ 148 @Override 149 boolean equals(Object obj); 150 151 /** 152 * Force to redefine hashCode for the implementations of immutable collection classes. 153 * @return the calculated hashCode 154 */ 155 @Override 156 int hashCode(); 157 158 }