2017-05-31 76 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