2015-09-29 39 views
2

我要扭轉訪問列表內的順序()資源下載反向訪問列表的順序在for循環中

這是我的實際代碼

for(int i = 0; i < states.size(); i++) { 
    System.out.println(states.size()); 
    states.get(i).update(true); // restore the first blockstate 
    states.remove(i); // remove the first blockstate from the list 
} 

此代碼的工作,但我想扭轉它。我已經嘗試了其他方法,例如使用i--,但它不起作用。有人可以提供建議嗎?

+2

您可以使用內置方法['Colletions.reverse'](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#reverse-java.util.List - )。 – Tunaki

+1

另一個需要注意的是,在'for'循環中執行'states.remove(i);'可能會拋出'ConcurrentModificationException'。如果你需要通過一個集合並且隨時移除東西,你應該堅持一個迭代器。 – npinti

+0

你想做同樣的事情,但從後面開始? – dasblinkenlight

回答

5

我已經嘗試了其他方法,例如使用i--,但它沒有奏效。

沖銷for循環包括三個步驟:

  • 變更初始值的最後一個值,
  • 變化的條件經過初始值
  • 倒車增量之後停止/遞減(即++變成--

在y我們的代碼這一變化將如下所示:

for(int i = states.size()-1 ; i >= 0 ; i--) { 
    System.out.println(states.size()); 
    states.get(i).update(true); // restore the current blockstate 
    states.remove(i); // remove the current blockstate from the list 
} 

注意的是,在原始循環到達最後一個值是states.size()-1,不states.size(),所以i需要在states.size()-1開始爲好。

由於您的循環最終會清除列表,但一次只能處理一個元素,您可以通過刪除remove(i)的呼叫,並在循環後用states.clear()代替它,從而獲得更好的清晰度。

for(int i = states.size()-1 ; i >= 0 ; i--) { 
    System.out.println(states.size()); 
    states.get(i).update(true); // restore the current blockstate 
} 
states.clear(); 
+0

Yhea這是工作,但你將如何做每個循環之間的時間間隔?我有一個新的regenBlock(states).runTaskTimer(this,40,17); \t但現在不工作,它循環非常快 – user3000019

0

試試這個:如果u想訪問元素時則u必須使用簡單,因爲這是不可能使用迭代器刪除元素

List list = Lists.reverse(states); 
for(int i = 0; i < list.size(); i++) { 
    System.out.println(list.size()); 
    list.get(i).update(true); // restore the first blockstate 
    //list.remove(i); // remove the first blockstate from the list 
} 

...它會引發併發修改例外