とが並べ替えられている場合one
、現在の位置での最小値が何であるかをリストの特定のセットでチェックし、そこに進むカスタム イテレータを作成できます。two
three
次のようになります (テストされていません)。
class MultiListIterator {
List<Number>[] lists;
int[] positions;
MultiListIterator(List<Number>... lists) {
this.lists = lists;
positions = new int[lists.length];
}
boolean hasNext() {
for (int i = 0; i < lists.length; i++) {
if (positions[i] < lists[i].length) return true;
}
return false;
}
Number next() {
int bestIndex = -1;
Number bestNumber = null;
for (int i = 0; i < lists.length; i++) {
var p = positions[i];
if (p >= positions[i].length) continue;
Number n = lists[i].get(p);
if (bestNumber == null || n.getValue() < bestNumber.getValue()) {
bestIndex = i;
bestNumer = n;
}
}
if (bestNumber == null) throw new RuntimeException("next() beyond hasNext()");
positions[bestIndex++];
return bestNumber;
}
}
使用法:
MultiListIterator mli = new MultiListIterator(one, two, three);
while (mli.hasNext()) {
mli.next().doThing();
}
MultiListIterator
実装させたい場合がありますIterator<Number>
。
Java にはすでにビルトイン クラス Number があることに注意してください。クラスに同じ名前を使用すると、どこかにインポートするのを忘れたときに、多くの混乱が生じる可能性があります。