Shapovalov.Ivan86
BAN USERimport java.util.*;
public class Main {
public static void main(String ... args) {
var superIterator = new SuperIterator<>(
Arrays.asList(
Arrays.asList(1, 4, 5, 20).iterator(),
Arrays.asList(2, 10, 12, 50).iterator(),
Arrays.asList(5, 7, 17, 32).iterator(),
Arrays.asList(7, 16, 28, 40).iterator()
)
);
Collection<Integer> superIteratorSequence = new ArrayList<>();
while (superIterator.hasNext()) {
superIteratorSequence.add(superIterator.next());
}
System.out.println(superIteratorSequence);
// expecting
// [1, 2, 4, 5, 7, 10, 12, 16, 17, 20, 28, 32, 40, 50]
}
}
class SuperIterator<T extends Comparable> {
private final SortedMap<T, Integer> currentValuesMap;
private final ArrayList<Iterator<T>> iterators;
public SuperIterator(Collection<Iterator<T>> iters) {
this.iterators = new ArrayList<>(iters);
this.currentValuesMap = new TreeMap<>();
for (int i = 0; i < iterators.size(); i++) {
Iterator<T> iterator = iterators.get(i);
putNextNonDuplicatingValue(currentValuesMap, iterator, i);
}
int i = 0;
}
public boolean hasNext() {
return !currentValuesMap.isEmpty();
}
public T next() {
if (currentValuesMap.isEmpty()) {
return null;
}
T minValue = currentValuesMap.firstKey();
Integer minValueIteratorIndex = currentValuesMap.remove(minValue);
Iterator<T> minValueIterator = iterators.get(minValueIteratorIndex);
putNextNonDuplicatingValue(currentValuesMap, minValueIterator, minValueIteratorIndex);
return minValue;
}
private void putNextNonDuplicatingValue(
SortedMap<T, Integer> currentValuesMap,
Iterator<T> iterator,
int index
) {
if (iterator.hasNext()) {
T nextValue = iterator.next();
while (currentValuesMap.containsKey(nextValue) && iterator.hasNext()) {
nextValue = iterator.next();
}
currentValuesMap.putIfAbsent(nextValue, index);
}
}
}
- Shapovalov.Ivan86 July 22, 2020