2014-08-28 3 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, и заранее каждый из них в каждой итерации цикла, пока вы не превысите предел:

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 является null в конце цикла, не было найдено никаких действительных элементов. В противном случае found содержит ближайший к idx. Если два действительных элемента расположены на том же расстоянии от 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"); 
     } 

    } 

} 
Смежные вопросы