2017-05-31 60 views
0

我使用這個for循環:飛鏢 - 獲取內部下一個元素一個for循環

for (var elem in sortedTokens){ 
    if (elem.identifier == "ACCESSOR"){ 
     // 
    } 
    else if (elem.identifier == "PROPERTY"){ 
     // Check the identifier of the next element 
    } 
} 

我怎麼能訪問它裏面的下一個元素?到目前爲止,我一直使用Dart中的索引進行while循環。什麼是正確的做法?

感謝

回答

1

你可能想使用一個普通的for循環:

for (int i = 0; i < sortedTokens.length; i++){ 
    var elem = sortedTokens[i]; 
    if (elem.identifier == "ACCESSOR"){ 
     // 
    } 
    else if (elem.identifier == "PROPERTY"){ 
     if (i+1 < sortedTokens.length) { 
      var nextElem = sortedTokens[i+1]; 
      // Check the identifier of the next element 
     } 
    } 
} 

但是你可以把它一步,換行功能:

void forEach<T>(List<T> list, void action(T current, T next)) { 
    for (var i = 0; i < list.length; i++) { 
    T current = list[i]; 
    T next = i+1 < list.length ? list[i+1] : null; 
    action(current, next); 
    } 
} 

forEach (sortedTokens, (elem, next) { 
    if (elem.identifier == "ACCESSOR"){ 
     // 
    } 
    else if (elem.identifier == "PROPERTY"){ 
     if (next != null) { 
      // Check the identifier of the next element 
     } 
    } 
}); 

工作DartPad示例

+0

非常有創意的方法,謝謝;) – OhMad

2

在處理當前元素時,不能訪問迭代的下一個元素。 一個for-in圈像for (var elem in sortedTokens) { ... }大致等同於:

for (var it = sortedTokens.iterator; it.moveNext();) { 
    var elem = it.current; 
    ... 
} 

正如你所看到的,移動到下一個元素moveNext在當前元素的身體已完成時才執行。

所以,沒有辦法做任何你想做的事情,for-in沒有做一些變通。 for-in針對每個元素進行了優化,而不是用於訪問無序元素。

最簡單的解決方法就是僅僅使用索引。如果在某些情況下實際需要向前看或後面或更快步進,則沒有任何問題。

另一種變通辦法可以是:

bool isProperty = false; 
for (var elem in sortedTokens) { 
    if (isProperty) { 
    // check the identifier of the current element 
    isProperty = false; 
    continue; 
    } 
    if (elem.identifier == "ACCESSOR") { 
    // 
    } else if (elem.identifier == "PROPERTY") { 
    isProperty = true; 
    } 
} 

這只是保持狀態(這裏它只是一個布爾)元素之間,所以下一個元素知道你想用它做什麼。 在某些情況下,這很有用也很方便(比如建立一個以逗號分隔的列表,你想要特殊情況下第一個元素不加逗號),在其他情況下,它比它的價值更麻煩,因爲狀態變得笨重,邏輯令人費解的。

+0

感謝您的真棒答案! – OhMad

相關問題