我有一个 DocObject 类型的对象,其中包含一个名为 children 的 DocObject 数组列表,每个对象本身可能包含也可能不包含子对象。我正在为此对象编写一个名为 replace() 的函数,它需要一个要搜索的子项,如果 DocObject 包含该子项,则该子项应替换为 newObj。我环顾了该网站并搜索了谷歌,但我所看到的一切都不起作用。下面的代码显示了我的尝试:
public void replace(DocObject oldObj, DocObject newObj) {
for (DocObject child : children ) {
if (child == oldObj) {
child = newObj;
}
}
}
还有这个(这会导致溢出异常):
public void replace(DocObject oldObj, DocObject newObj) {
if (children.indexOf(oldObj) != -1)
children.set(children.indexOf(oldObj), newObj);
for (DocObject child : children)
child.replace(oldObj, newObj);
}
但是,这并没有替换子项,我已经检查过 if 语句是否正常工作并且满足其条件。如何用 newObj 替换 oldObj?
最佳答案
我不建议在操作列表时使用 for (X x: thingWithXs)
结构进行循环。我建议使用 indexOf
来搜索所需的对象,如果找不到,则递归调用您正在查看的对象的子项上的替换。
请注意,您必须修改 replace
方法以接受对象列表作为参数:
public boolean replace(List<E> list, E oldE, E newE) {
if (list == null) {
return false;
}
int index = list.indexOf(oldE);
if (index > 0) {
list.set(index, newE);
return true;
}
for (int i = 0, l = list.size(); i < l; i++) {
List<E> children = list.get(i).children;
if (replace(children, oldE, newE)) {
return true;
}
}
return false;
}
免责声明:以上代码尚未经过测试。它应该能让您了解如何完成。本质上,它归结为检查您要查找的元素是否在列表中,如果不在列表中,则遍历列表并检查每组子元素。
关于Java用未知索引替换arraylist中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22188431/