gpt4 book ai didi

java - Java 中的递归枚举

转载 作者:行者123 更新时间:2023-12-04 06:52:25 24 4
gpt4 key购买 nike

我还有一个关于枚举的问题。这是情况的快速草图。
我有一个 Backpack 类,它有一个 Hashmap 内容,键是一个 long 类型的变量,值是一个带有 Items 的 ArrayList。
我必须编写一个枚举来遍历背包的内容。但这里有一个问题:在一个背包中,也可以有另一个背包。并且 Enumeration 还应该能够遍历背包中背包的内容。 (我希望你能跟上,我不太擅长解释..)

这是我的代码:

public Enumeration<Object> getEnumeration() {
return new Enumeration<Object>() {
private int itemsDone = 0;
//I make a new array with all the values of the HashMap, so I can use
//them in nextElement()
Collection<Long> keysCollection = getContent().keySet();
Long [] keys = keysCollection.toArray(new Long[keysCollection.size()]);

public boolean hasMoreElements() {
if(itemsDone < getContent().size()) {
return true;
}else {
return false;
}

}

public Object nextElement() {
ArrayList<Item> temporaryList= getContent().get(keys[itemsDone]);
for(int i = 0; i < temporaryList.size(); i++) {
if(temporaryList.get(i) instanceof Backpack) {
return temporaryList.get(i).getEnumeration();
}else {
return getContent().get(keys[itemsDone++]);
}
}
}
};

这段代码能正常工作吗?这只是“返回临时列表.get(i).getEnumeration();”我对某事感到担心。用户是否仍然可以像往常一样只使用 hasMoreElemens() 和 nextElement() ?

任何帮助表示赞赏,

哈姆·德·维尔特

最佳答案

您需要创建一个 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)

关于java - Java 中的递归枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2937980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com