fork download
  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.Collection;
  4. import java.util.Collections;
  5. import java.util.Comparator;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import java.util.NoSuchElementException;
  9.  
  10. public class Main {
  11.  
  12. @SafeVarargs
  13. private static <T> Iterator<T> from(T... array) {
  14. return Arrays.asList(array).iterator();
  15. }
  16.  
  17. @SafeVarargs
  18. private static <T> void testSuperIterator(List<T> expected, Comparator<T> comparator, Iterator<T>... iterators) {
  19. final SuperIterator<T> superIterator = new SuperIterator<T>(Arrays.asList(iterators), comparator);
  20. final List<T> actual = new ArrayList<>(expected.size());
  21. while (superIterator.hasNext()) {
  22. actual.add(superIterator.next());
  23. }
  24.  
  25. if (!actual.equals(expected)) {
  26. throw new IllegalStateException("Expected: " + expected + "! Actual: " + actual);
  27. }
  28. System.out.println(actual);
  29. }
  30.  
  31. private static Comparator<Integer> INTEGER_COMPARATOR = Integer::compareTo;
  32.  
  33. @SafeVarargs
  34. private static void testIntSuperIterator(List<Integer> expected, Iterator<Integer>... iterators) {
  35. testSuperIterator(expected, INTEGER_COMPARATOR, iterators);
  36. }
  37.  
  38. private static Iterator EMPTY_ITERATOR_INSTANCE = new Iterator() {
  39.  
  40. @Override
  41. public boolean hasNext() {
  42. return false;
  43. }
  44.  
  45. @Override
  46. public Object next() {
  47. }
  48. };
  49.  
  50. private static <T> Iterator<T> emptyIterator() {
  51. //noinspection unchecked
  52. return EMPTY_ITERATOR_INSTANCE;
  53. }
  54.  
  55. static class SuperIterator<T> implements Iterator<T> {
  56.  
  57. private final Iterator<T>[] iterators;
  58.  
  59. private final Object[] peekedElements;
  60.  
  61. private final Comparator<T> comparator;
  62.  
  63. public SuperIterator(Collection<Iterator<T>> iterators, Comparator<T> comparator) {
  64. //noinspection unchecked
  65. final Iterator<T>[] iteratorsArray = (Iterator<T>[]) iterators.toArray();
  66. this.iterators = iteratorsArray;
  67. this.peekedElements = new Object[iteratorsArray.length];
  68. this.comparator = comparator;
  69. }
  70.  
  71. @Override
  72. public boolean hasNext() {
  73. for (Object peekedElement : peekedElements) {
  74. if (peekedElement != null) {
  75. return true;
  76. }
  77. }
  78.  
  79. final Iterator<T>[] iterators = this.iterators;
  80. for (int i = 0; i < iterators.length; i++) {
  81. final Iterator<T> iterator = iterators[i];
  82. if (iterator != null) {
  83. if (iterator.hasNext()) {
  84. return true;
  85. } else {
  86. iterators[i] = null;
  87. }
  88. }
  89. }
  90.  
  91. return false;
  92. }
  93.  
  94. @Override
  95. public T next() {
  96. final Iterator<T>[] iterators = this.iterators;
  97. final Object[] peekedElements = this.peekedElements;
  98.  
  99. final int length = iterators.length;
  100. int minValuePosition = -1;
  101. T minValue = null;
  102. for (int i = 0; i < length; i++) {
  103. //noinspection unchecked
  104. T peekedElement = (T) peekedElements[i];
  105. if (peekedElement == null) {
  106. final Iterator<T> iterator = iterators[i];
  107. if (iterator != null) {
  108. if (iterator.hasNext()) {
  109. peekedElements[i] = peekedElement = iterator.next();
  110. } else {
  111. iterators[i] = null;
  112. }
  113. }
  114. }
  115. if (peekedElement != null && (minValuePosition < 0 || comparator.compare(peekedElement, minValue) < 0)) {
  116. minValuePosition = i;
  117. minValue = peekedElement;
  118. }
  119. }
  120.  
  121. if (minValuePosition < 0) {
  122. }
  123.  
  124. peekedElements[minValuePosition] = null;
  125.  
  126. return minValue;
  127. }
  128. }
  129.  
  130. public static void main(String[] args) {
  131. testIntSuperIterator(
  132. Collections.emptyList(),
  133. emptyIterator()
  134. );
  135.  
  136. testIntSuperIterator(
  137. Collections.singletonList(1),
  138. from(1)
  139. );
  140.  
  141. testIntSuperIterator(
  142. Collections.singletonList(Integer.MIN_VALUE),
  143. from(Integer.MIN_VALUE)
  144. );
  145.  
  146. testIntSuperIterator(
  147. Arrays.asList(1, 2, 4, 5),
  148. from(1, 2, 4, 5)
  149. );
  150.  
  151. testIntSuperIterator(
  152. Arrays.asList(Integer.MIN_VALUE, 1, 2, 4, 5),
  153. from(Integer.MIN_VALUE, 1, 2, 4, 5)
  154. );
  155.  
  156. testIntSuperIterator(
  157. Arrays.asList(1, 2, 4, 5),
  158. emptyIterator(), from(1, 2, 4, 5)
  159. );
  160.  
  161. testIntSuperIterator(
  162. Arrays.asList(1, 2, 4, 5),
  163. from(1, 2, 4, 5), emptyIterator()
  164. );
  165.  
  166. testIntSuperIterator(
  167. Arrays.asList(Integer.MIN_VALUE, 1, 2, 4, 5),
  168. emptyIterator(), from(Integer.MIN_VALUE, 1, 2, 4, 5)
  169. );
  170.  
  171. testIntSuperIterator(
  172. Arrays.asList(Integer.MIN_VALUE, 1, 2, 4, 5),
  173. from(Integer.MIN_VALUE, 1, 2, 4, 5), emptyIterator()
  174. );
  175.  
  176. testIntSuperIterator(
  177. Arrays.asList(1, 2, 4, 5),
  178. from(5), from(4), from(1), from(2)
  179. );
  180.  
  181. testIntSuperIterator(
  182. Arrays.asList(1, 1, 2, 4, 5),
  183. from(1, 5), from(4), from(1), from(2)
  184. );
  185.  
  186. testIntSuperIterator(
  187. Arrays.asList(1, 1, 2, 2, 2, 4, 5),
  188. from(1, 2, 2, 5), from(4), from(1), from(2)
  189. );
  190.  
  191. testIntSuperIterator(
  192. Arrays.asList(1, 1, 2, 2, 2, 4, 5, Integer.MAX_VALUE, Integer.MAX_VALUE),
  193. from(1, 2, 5), from(4, Integer.MAX_VALUE), from(1), from(2, 2, Integer.MAX_VALUE)
  194. );
  195. }
  196. }
  197.  
Success #stdin #stdout 0.13s 2184192KB
stdin
Standard input is empty
stdout
[]
[1]
[-2147483648]
[1, 2, 4, 5]
[-2147483648, 1, 2, 4, 5]
[1, 2, 4, 5]
[1, 2, 4, 5]
[-2147483648, 1, 2, 4, 5]
[-2147483648, 1, 2, 4, 5]
[1, 2, 4, 5]
[1, 1, 2, 4, 5]
[1, 1, 2, 2, 2, 4, 5]
[1, 1, 2, 2, 2, 4, 5, 2147483647, 2147483647]