2014-03-05 34 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