2014-03-05 2 views
3

DocObject 유형의 객체가 있는데,이 객체 안에는 DocObject 객체가 포함되어 있습니다. 각각의 객체는 자식을 포함하거나 포함하지 않을 수 있습니다. replace()라는 이름의이 객체에 대한 함수를 작성하여 아이를 검색하고 DocObject에 그 아이가 포함되어 있으면 자식을 newObj로 대체해야합니다. 나는 사이트를 둘러 보았고 google을 검색했지만 아무 것도 보지 못했다.자바가 알 수없는 색인을 가진 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 문이 올바르게 작동하고 조건이 충족되었다는 것을 나타냅니다. oldObj를 newObj로 대체하려면 어떻게해야합니까?

+0

왜 루프가 필요합니까? 'List # indexOf'를 직접 사용할 수없는 이유는 무엇입니까? 'while (children.indexOf (oldObj)! = -1) {...}' – MadProgrammer

답변

1

목록을 조작하는 동안 for (X x: thingWithXs) 구문을 사용하여 반복하지 않는 것이 좋습니다. 원하는 객체를 검색 할 때 indexOf을 사용하는 것이 좋습니다. 찾을 수없는 경우보고있는 객체의 하위 객체에 대해 replace를 재귀 적으로 호출하는 것이 좋습니다. 인수로 개체의 목록을 허용하도록 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

이런 식으로 뭔가? 탭이 보이지 않으면 나옵니다. op 편집 – kylecblyth

+0

두 번째 예. 그 오버 플로우 오류 – kylecblyth

관련 문제