Первая часть вопроса была:
Учитывая k
отсортированных массивов, реализовать итератор для перебора элементов массивов в порядке возрастания.Например:
Если мы имеем: a1 = {1,3,5}, a2 = {2,4,4,5}
, то вызов метода next()
итератора, реализованного 7 раз, вернет: 1,2,3,4,4,5,5
.
Мне удалось реализовать эту часть, и я написал код для нее ниже.
Вторая часть реализовывала этот класс итераторов, когда метод next()
не возвращает дубликаты.Для массивов в примере выше, если мы вызываем метод next()
для 5 раз, мы получаем: 1,2,3,4,5
(если мы вызываем его 6 раз, нам нужно получить исключение).
Я думал, что это будет не сложно - просто используйте поле HashSet
, добавляйте элементы в этот набор при вводе их в кучу и создавайте следующий как цикл, который завершается, когда вы получаете уникальный элемент.
Проблема с этим подходом состоит в том, что метод hasNext()
не будет эффективным: вам придется перебирать элементы, которые будут вставлены в кучу в будущих вызовах, чтобы знать, что в будущем у вас будет уникальный элемент для next()
.
У вас есть идея, как эффективно реализовать этот итератор без дубликатов?
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.PriorityQueue;
public class ComplexIterator implements Iterator<Integer>{
private class IndexedArrayValue implements Comparable<IndexedArrayValue> {
int arrayId;
int index;
int value;
public IndexedArrayValue(int arrayId, int index, int value) {
this.arrayId = arrayId;
this.index = index;
this.value = value;
}
@Override
public int compareTo(IndexedArrayValue other) {
return this.value - other.value;
}
}
private int[][] lists;
private PriorityQueue<IndexedArrayValue> minHeap;
public ComplexIterator(int[][] lists) {
minHeap = new PriorityQueue<IndexedArrayValue>();
int numOfLists = lists.length;
this.lists = lists;
for (int i = 0; i < numOfLists; i++) {
minHeap.add(new IndexedArrayValue(i, 0, lists[i][0]));
}
}
@Override
public boolean hasNext() {
return !this.minHeap.isEmpty();
}
@Override
public Integer next() {
if (!hasNext())
throw new NoSuchElementException();
IndexedArrayValue indArrVal = minHeap.poll();
int arrayId = indArrVal.arrayId;
int index = indArrVal.index;
int value = indArrVal.value;
int nextIndex = index + 1;
if (nextIndex < lists[arrayId].length) {
minHeap.add(new IndexedArrayValue(arrayId, nextIndex, lists[arrayId][nextIndex]));
}
return value;
}
public static void main (String[] args) {
int[] arr1 = { 1, 2, 3 };
int[] arr2 = { 1, 4 };
int[] arr3 = { 2, 5, 7, 8 };
int[][] arrs = new int[][] {arr1, arr2, arr3};
ComplexIterator it = new ComplexIterator(arrs);
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
}
}