2014-08-28 48 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)迭代? – 2014-08-28 08:05:22

+1

http://stackoverflow.com/questions/2102499/iterating-through-a-list-in-reverse-order-in-java ::這裏是相反的順序 – 2014-08-28 08:07:10

+0

使用'iter.hasPrevious()'和'iter.previous ()'就像你用'next()'做的那樣 – alfasin 2014-08-28 08:07:56

回答

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; 
     } 
    } 
} 

如果foundnull在循環的結束,沒有發現有效的項目。否則,found包含最近的項目idx。如果兩個有效物品位於與idx相同的距離處,則將返回位於前面的物品。

+0

你在while條件中有一個錯字--bck應該檢查「hasPrevious」。 – brindy 2014-08-28 08:15:12

+0

@brindy修正了,謝謝! – dasblinkenlight 2014-08-28 08:16:14

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"); 
     } 

    } 

}