Java用未知索引替换arraylist中的对象

标签 java arraylist replace indexof

我有一个 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/

相关文章:

java - java读取json数据

Java:将不同类型的对象放入 ModelCollection 的 ArrayList 中。接口(interface)?

java - 工作时间表

ruby - ruby 中的字符串替换方法有什么用?

java - Java 和 Hibernate 中外键的使用

java - 如何从 JLabel 保存图像

php - 使用PHP替换文本文件中的字符串

Java通过替换特殊字符来转换一组字符串

java - 无法通过 SSL 使用 Amazon S3 API?

java - 无法对数组类型 char[] 调用 add(char)