2014-08-28 2 views
0

"유효한"요소가 발견 될 때까지 객체 목록을 가지고 앞으로 및 뒤로 반복하고 싶습니다.목록을 양방향으로 반복하는 방법은 무엇입니까?

MyClass { 
    private boolean valid; 
    public boolean isValid() { return valid; } 
} 

List<MyClass> classes; //assume sorted list 

은 이제 유효 가장 가까운 요소를 찾기 위해 뒤로 위치 idx에서 시작, 모두 전달을 반복하고 싶습니다. 지금까지 나는 이미 전달 알고리즘을 작동 시켰습니다. 하지만 코드를 최적화 할 수 있다고 생각 :

반복자 알고리즘이 더 나은 기록 할 수 위치 X

int idx = 10; 

//find the closest element that is valid 
for (ListIterator<MyClass> itr = classes.listIterator(idx); itr.hasNext();) { 
    if (itr.hasNext()) { 
     MyClass my = itr.next(); 
     while (!my.isValid()) { 
      if (itr.hasNext()) { 
       my = itr.next(); 
      } else { 
       break; 
      } 
     } 
    } 
    Sysout("the closest valid element is: " + my); 
} 

에서 시작되어 //?

+1

왜 List.get (int index)를 사용하여 반복하지 않습니까? –

+1

http://stackoverflow.com/questions/2102499/iterating-through-a-list-in-reverse-order-in-java :: 역 순서로 여기에 –

+0

'iter.hasPrevious()'와'iter.previous()'당신이'next()'와 같이하는 것 – alfasin

답변

3

두 개의 반복기를 동시에 사용하십시오. 당신이 한도에 도달 할 때까지, idx에서 둘 다 시작하고 루프의 각 반복에 그들 각각의 발전 : 루프의 끝에서 null입니다

ListIterator<MyClass> fwd = classes.listIterator(idx); 
ListIterator<MyClass> bck = classes.listIterator(idx); 
MyClass found = null; 
while (fwd.hasNext() || bck.hasPrevious()) { 
    if (fwd.hasNext()) { 
     MyClass my = fwd.next(); 
     if (my.isValid()) { 
      found = my; 
      break; 
     } 
    } 
    if (bck.hasPrevious()) { 
     MyClass my = bck.previous(); 
     if (my.isValid()) { 
      found = my; 
      break; 
     } 
    } 
} 

found 경우, 유효한 항목을 찾을 수 없습니다. 그렇지 않으면 foundidx에 가장 가까운 항목이 포함됩니다. 두 개의 유효한 항목이 idx에서 같은 거리에있는 경우 전달되는 항목이 반환됩니다.

+0

당신은 while 조건에 오타가있다 - bck는 "hasPrevious"를 체크해야한다. – brindy

+0

@brindy 고침, 고마워! – dasblinkenlight

1
 package iteratorPract; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.ListIterator; 

public class MyIterClass { 
    private boolean valid; 

    public boolean isValid() { 
     return this.valid; 
    } 

    public void setValid(boolean valid) { 
     this.valid = valid; 
    } 

    public static void main(String[] args) { 
     MyIterClass m1 = new MyIterClass(); 
     m1.setValid(true); 
     MyIterClass m2 = new MyIterClass(); 
     List<MyIterClass> classes = new ArrayList<MyIterClass>(); 
     classes.add(m1); 
     classes.add(m2); 

     // from last 
     ListIterator<MyIterClass> l1 = classes.listIterator(classes.size()); 

     while (l1.hasPrevious()) { 
      if (l1.previous().isValid()) 
       System.out.println("it is valid"); 
      else 
       System.out.println("not valid"); 
     } 
     // from start 
     ListIterator<MyIterClass> l2 = classes.listIterator(); 

     while (l1.hasNext()) { 
      if (l1.next().isValid()) 
       System.out.println("it is valid"); 
      else 
       System.out.println("not valid"); 
     } 

    } 

} 
관련 문제