【问题标题】:Java replace object in arraylist with unknown indexJava用未知索引替换arraylist中的对象
【发布时间】:2014-03-05 04:19:12
【问题描述】:

我有一个 DocObject 类型的对象,其中包含一个称为子对象的 DocObjects 数组列表,每个子对象本身可能包含也可能不包含子对象。我正在为此对象编写一个名为 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 语句是否正常工作并且它的条件满足。如何将 oldObj 替换为 newObj?

【问题讨论】:

  • 为什么需要循环开始?为什么不能直接使用List#indexOf?可以使用类似while (children.indexOf(oldObj) != -1) {...}

标签: java arraylist replace indexof


【解决方案1】:

我不建议在操作列表时使用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;
}

免责声明:上述代码未经测试。它应该让您了解如何完成它。基本上它归结为检查您要查找的元素是否在列表中,如果没有,则遍历列表并检查每组子元素。

【讨论】:

  • +1 建议使用indexOf。增强的 for 循环对于遍历子项以进行递归很有用。
  • 这样的?举起标签不显示。不适编辑操作
  • @kylecblyth 更新了答案,让您更好地了解我的想法。
  • 仍有一些问题,但我相信我可以通过一些修补来解决这些问题。谢谢!
猜你喜欢
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 2014-02-01
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多