1
for(elt <- bufferObject: scala.collection.mutable.Buffer)
  // Do something with the element of the collection

for ループ内の要素はどの順序でアクセスされますか? 無作為に ?

Scala API から、Buffer が Seq のサブクラスであり、要素が順序付けられていることがわかります。これは上記のループにも当てはまりますか?

4

4 に答える 4

7

のスーパータイプの選択と、mutable.Buffer[A]それらが提供するトラバーサル保証を次に示します。

  • Seq[A]-- すべての要素には位置があり、インデックスが関連付けられています。それらは、最低のインデックスから最高のインデックスまで、常に 1 つずつトラバースされます。
  • GenSeq[A]-- すべての要素には位置があり、インデックスが関連付けられています。それらは、1 つずつ、または並行してトラバースすることができます。新しいコレクションが生成された場合、トラバーサルが並列であっても、新しいコレクション内の要素の位置は古いコレクションに対応します。
  • Iterable[A]-- 要素は任意の順序でトラバースできますが、常に同じ順序でトラバースされます (つまり、反復ごとに変更することはできません)。それらは 1 つずつトラバースされます。
  • GenIterable[A]-- 要素は任意の順序でトラバースできますが、常に同じ順序でトラバースされます (つまり、反復ごとに変更することはできません)。トラバーサルは、1 つずつまたは並行して発生する可能性があります。新しいコレクションが生成された場合、トラバーサルが並列であっても、新しいコレクション内の要素の位置は古いコレクションに対応します。
  • Traversable[A]-- と同じ保証Iterable[A]がありますが、トラバーサルを中断できるという追加の制限がありますが、次の要素がいつ選択されるかを判断することはできません (Iterable[A]および子孫で、 を生成することによって選択できますIterator)。
  • GenTraversable[A]-- と同じ保証GenIterable[A]がありますが、トラバーサルを中断できるという追加の制限がありますが、次の要素がいつ選択されるかを判断することはできません (GenIterable[A]および子孫で、 を生成することによって選択できますIterator)。
  • TraversableOnce[A]-- と同じ保証Traversable[A]ですが、要素を複数回トラバースできない場合があるという追加の制限があります。
  • GenTraversableOnce[A]-- と同じ保証GenTraversable[A]ですが、要素を複数回トラバースできない場合があるという追加の制限があります。

これで、すべての保証が適用され、制限が少なくなりSeq[A]ましたmutable.Buffer[A]

次に、for ループに進みます。

for(elt <- bufferObject: scala.collection.mutable.Buffer)
  doSomething(elt)

は次と同じです:

bufferObject.foreach(elt => dosomething(elt))

for(elt <- bufferObject: scala.collection.mutable.Buffer)
yield makeSomething(elt)

は次と同じです:

bufferObject.map(elt => makeSomething(elt))

実際、すべての バリアントは、 (またはそこにある他の型) でfor使用可能なメソッドに変換されるため、コレクションによって提供される保証がすべて適用されます。Bufferたとえば、 aGenSeqを (for-yield) と共に使用するとmap、すべての要素が並列に処理される可能性がありますnewCollection(i) == makeSomething(bufferObject(i))が、インデックスが保持されるコレクションが生成されることに注意してください。

于 2012-06-06T23:07:11.603 に答える
1

はい、for-comprehensionは、、、およびのいくつかの組み合わせmapに脱糖し、これらはすべての定義された順序に従います。flatMapforeachSeq

于 2012-06-06T20:50:13.867 に答える
1

(メソッドを介して) 並列コレクションを使用していない限りpar、変更可能な Buffer 内の操作の順序 (理解、マップ、foreach、およびその他の順次メソッドなど) は保証されます。

于 2012-06-06T21:01:26.010 に答える