Advertisement
Guest User

Untitled

a guest
Feb 17th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.15 KB | None | 0 0
  1. package ru.ifmo.rain.kramer.arrayset;
  2.  
  3. import java.util.AbstractSet;
  4. import java.util.ArrayList;
  5. import java.util.Collection;
  6. import java.util.Collections;
  7. import java.util.Comparator;
  8. import java.util.Iterator;
  9. import java.util.List;
  10. import java.util.NavigableSet;
  11. import java.util.NoSuchElementException;
  12. import java.util.Objects;
  13. import java.util.SortedSet;
  14. import java.util.TreeSet;
  15.  
  16. public class ArraySet<T> extends AbstractSet<T> implements NavigableSet<T> {
  17. private final List<T> data;
  18. private final Comparator<? super T> comparator;
  19.  
  20. public ArraySet() {
  21. comparator = null;
  22. data = Collections.emptyList();
  23. }
  24.  
  25. public ArraySet(Collection<? extends T> other) {
  26. comparator = null;
  27. data = new ArrayList<>(new TreeSet<>(other));
  28. }
  29.  
  30. public ArraySet(Collection<? extends T> other, Comparator<? super T> cmp) {
  31. comparator = cmp;
  32. TreeSet<T> tmp = new TreeSet<>(cmp);
  33. tmp.addAll(other);
  34. data = new ArrayList<>(tmp);
  35. }
  36.  
  37. public ArraySet(Comparator<? super T> cmp) {
  38. comparator = cmp;
  39. data = Collections.emptyList();
  40. }
  41.  
  42. private ArraySet(List<T> arr, Comparator<? super T> cmp) {
  43. comparator = cmp;
  44. data = arr;
  45. if (arr instanceof ReversedList) {
  46. ((ReversedList) arr).reverse();
  47. }
  48. }
  49.  
  50. @Override
  51. public int size() {
  52. return data.size();
  53. }
  54.  
  55. @Override
  56. public Iterator<T> iterator() {
  57. return Collections.unmodifiableList(data).iterator();
  58. }
  59.  
  60. @Override
  61. public boolean contains(Object o) {
  62. return Collections.binarySearch(data, (T) Objects.requireNonNull(o), comparator) >= 0;
  63. }
  64.  
  65. private T getElem(int ind) {
  66. return (ind < 0) ? null : data.get(ind);
  67. }
  68.  
  69. private boolean validInd(int x) {
  70. return 0 <= x && x < size();
  71. }
  72.  
  73. private int indexGetter(T t, int found, int notFound) {
  74. int res = Collections.binarySearch(data, Objects.requireNonNull(t), comparator);
  75. if (res < 0) {
  76. res = -res - 1;
  77. return validInd(res + notFound) ? res + notFound : -1;
  78. }
  79. return validInd(res + found) ? res + found : -1;
  80. }
  81.  
  82. private int lowerInd(T t) {
  83. return indexGetter(t, -1, -1);
  84. }
  85.  
  86. private int higherInd(T t) {
  87. return indexGetter(t, 1, 0);
  88. }
  89.  
  90. private int floorInd(T t) {
  91. return indexGetter(t, 0, -1);
  92. }
  93.  
  94. private int ceilingInd(T t) {
  95. return indexGetter(t, 0, 0);
  96. }
  97.  
  98. @Override
  99. public T first() {
  100. checkNonEmpty();
  101. return data.get(0);
  102. }
  103.  
  104. @Override
  105. public T last() {
  106. checkNonEmpty();
  107. return data.get(size() - 1);
  108. }
  109.  
  110. private void checkNonEmpty() {
  111. if (data.isEmpty()) {
  112. throw new NoSuchElementException();
  113. }
  114. }
  115.  
  116. @Override
  117. public T lower(T t) {
  118. return getElem(lowerInd(t));
  119. }
  120.  
  121. @Override
  122. public T higher(T t) {
  123. return getElem(higherInd(t));
  124. }
  125.  
  126. @Override
  127. public T floor(T t) {
  128. return getElem(floorInd(t));
  129. }
  130.  
  131. @Override
  132. public T ceiling(T t) {
  133. return getElem(ceilingInd(t));
  134. }
  135.  
  136. @Override
  137. public T pollFirst() {
  138. throw new UnsupportedOperationException();
  139. }
  140.  
  141. @Override
  142. public T pollLast() {
  143. throw new UnsupportedOperationException();
  144. }
  145.  
  146. @Override
  147. public NavigableSet<T> descendingSet() {
  148. return new ArraySet<>(new ReversedList<>(data), Collections.reverseOrder(comparator));
  149. }
  150.  
  151. @Override
  152. public Iterator<T> descendingIterator() {
  153. return descendingSet().iterator();
  154. }
  155.  
  156. @Override
  157. public NavigableSet<T> subSet(T fromElement, boolean fromInclusive, T toElement, boolean toInclusive) {
  158. int l = fromInclusive ? ceilingInd(fromElement) : higherInd(fromElement);
  159. int r = toInclusive ? floorInd(toElement) : lowerInd(toElement);
  160. if (l == -1 || r == -1 || l > r) {
  161. return new ArraySet<>(comparator);
  162. } else {
  163. return new ArraySet<>(data.subList(l, r + 1), comparator);
  164. }
  165. }
  166.  
  167. @Override
  168. public NavigableSet<T> headSet(T toElement, boolean inclusive) {
  169. if (data.isEmpty()) {
  170. return new ArraySet<>(comparator);
  171. }
  172. return subSet(first(), true, toElement, inclusive);
  173. }
  174.  
  175. @Override
  176. public NavigableSet<T> tailSet(T fromElement, boolean inclusive) {
  177. if (data.isEmpty()) {
  178. return new ArraySet<>(comparator);
  179. }
  180. return subSet(fromElement, inclusive, last(), true);
  181. }
  182.  
  183. @Override
  184. public SortedSet<T> subSet(T fromElement, T toElement) {
  185. return subSet(fromElement, true, toElement, false);
  186. }
  187.  
  188. @Override
  189. public SortedSet<T> headSet(T toElement) {
  190. return headSet(toElement, false);
  191. }
  192.  
  193. @Override
  194. public SortedSet<T> tailSet(T fromElement) {
  195. return tailSet(fromElement, true);
  196. }
  197.  
  198. @Override
  199. public Comparator<? super T> comparator() {
  200. return comparator;
  201. }
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement