2014-03-05 32 views
3

我有一个DocObject类型的对象,其中包含一个DocObject的数组列表,其中每个子对象都可以包含或不包含子对象。我正在为此对象编写一个名为replace()的函数,该函数接受要搜索的子项,并且如果DocObject包含该子项,则应该用newObj替换该子项。我浏览过网站并搜索了谷歌,但没有看到任何工作。下面的代码显示了我试过:Java替换列表中具有未知索引的ArrayList中的对象

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?

+0

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

回答

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; 
} 

免责声明:上面的代码没有经过测试。它应该给你一个关于如何完成的想法。基本上,它要检查的是你正在查找的元素是否在列表中,如果没有,遍历列表并检查每一组子元素。

+0

+1这样的建议使用'indexOf'。一个增强的'for'循环对于递归遍历孩子是非常有用的。 –

+0

这样的事情?阻止tabbing不显示。 ill编辑成op – kylecblyth

+0

第二个例子。它抛出溢出错误 – kylecblyth