Вам необходимо создать Stack<Enumeration<Object>>
. Когда вы видите другой Backpack
, вы push
новый Enumeration
на этом элементе в Stack
. Вы всегда nextElement()
с вершины стека. Если верхний элемент пуст, вы его отключаете. Повторять до тех пор, пока Stack.isEmpty()
.
Другой, возможно, более простой метод (в зависимости от того, насколько вам удобно с рекурсией) - это использовать «внутренние» перечисления, которые сами по себе могут иметь внутренние перечисления. Вот пример кода с использованием Iterator
на Object[]
. Он рекурсивно перебирает любые вложенные Object[]
.
public class RecursiveIterator implements Iterator<Object> {
final Object[] arr;
int index = 0;
Iterator<Object> inner;
RecursiveIterator(Object[] arr) {
this.arr = arr;
}
@Override public boolean hasNext() {
while (true) {
if (inner != null) {
if (inner.hasNext()) {
return true;
} else {
inner = null;
index++;
}
}
if (index == arr.length) return false;
if (arr[index] instanceof Object[]) {
inner = new RecursiveIterator((Object[]) arr[index]);
} else {
return true;
}
}
}
@Override public Object next() {
if (!hasNext()) throw new NoSuchElementException();
return (inner != null) ? inner.next() : arr[index++];
}
@Override public void remove() {
throw new UnsupportedOperationException();
}
}
Вот тестовый жгут:
static void dump(Object[] arr) {
Iterator<Object> iter = new RecursiveIterator(arr);
while (iter.hasNext()) {
System.out.print(iter.next() + " ");
}
System.out.println("(done)");
}
public static void main(String[] args) throws FileNotFoundException {
dump(new Object[] {
1,
2,
new Object[] {
3,
new Object[] { 4 },
5,
},
6,
new Object[] {},
7,
});
dump(new Object[] {
new Object[] {},
new Object[] {
new Object[] {
new Object[] {},
},
},
new Object[] {},
new Object[] { null },
});
}
Это печатает:
1 2 3 4 5 6 7 (done)
null (done)