2012-08-13 7 views
0

단일 값 또는 값 범위가 포함 된 목록이 있다고합시다. 이제이 목록에 새 값이나 범위를 추가하면 현재 값/범위의 여러 값과 중복되지 않을 수 있습니다. 이 겹치는 모든 오브젝트를 결합하여 새 인스턴스를 작성해야합니다.이 인스턴스는 목록에 추가해야하며 새 인스턴스에 포함 된 오브젝트는 원래 목록에서 삭제해야합니다.목록 값을 필터링하여 새 목록을 만들거나 원래 목록에서 값을 삭제해야합니까

내 질문에, 정말 목록에서 해당 개체를 삭제하거나 모든 반복마다 새 목록을 만들어야합니다. 즉, 코드에 넣어 :

해결 방법 1

for (Range newObj : newItems){ 
    Iterator it = oList.iterator(); 
    while (it.hasNext()){ 
    Range o = it.next(); 
    if (canCombine(newObj, o)){ 
     newObj = combine(newObj, o); 
     it.remove(); 
    } 
    } 
    oList.add(newObj); 
} 

해결 방법 2

for (Range newObj : newItems){ 
    List newList = new ArrayList(); 
    for (Range o : oList){ 
    if (canCombine(newObj, o)){ 
     new = combine(newObj, o); 
    } else { 
     newList.add(o); 
    } 
    } 
    newList.add(newObj); 
    oList = newList; 
} 

아마 다른 해결책이 더 나은 것입니다. 그렇다면 친절하게 알려주십시오.

+2

"다른 해결책이 더 나은 것 같습니다."올바른 점은 : 간격 나무가 더 좋은 해결책을 제공합니다. (http://en.wikipedia.org/wiki/Interval_tree). – dasblinkenlight

+0

목록에서 Object를 사용한다는 사실은 나에게 나쁘다. Range (from, from) 객체를 정의하지 않는 이유는 무엇입니까? 그것은 단일 값과 비 제로 범위를 캡슐화합니다. 조합 논리는 어떤 객체가 전달되었는지에 대해 내성을 가질 필요가 없습니다. (현재 당신이 의심하는 것처럼) –

+0

@BrianAgnew 저는 실제로 객체를 사용하지 않습니다. 이것은 객체의 올바른 이름이 부족하기 때문입니다. 실제로는 범위와 단일 값 클래스에 의해 구현되는 추상 클래스를 사용합니다. – Deiwin

답변

0

newItem을 반복 할 때마다 newList를 만들지 않거나 새로운 목록을 전혀 만들지 않아도된다고 생각합니다.

for (Object newObj : newItems){ 
    for(int i=0;i<oList.size();i++){ 
     if (canCombine(newObj, oList.get(i))){ 
      newObj = combine(newObj, oList.get(i)); 
      oList.remove(i); 
     }  
     } 
     oList.add(newObj); 
    } 
+0

반복자를 사용해야합니다. 하지만 당신이 의미하는 바를 봅니다. 나는 그 질문을 개선 할 것이다. – Deiwin

관련 문제