先日、なぜ scala.collection.Map が unzip メソッドを
def unzip [A1, A2] (implicit asPair: ((A, B)) ⇒ (A1, A2)): (Iterable[A1], Iterable[A2])
このメソッドは Seq のペアではなく Iterable のペアのみを返すため、Iterable はトラバーサルの順序を保証しないため、元のマップのキー/値のペアが返されたシーケンスの一致するインデックスで発生することは保証されません。だから私が持っていたら
Map((1,A), (2,B))
、その後呼び出した後
Map((1,A), (2,B)) unzip
私はで終わるかもしれません
... = (List(1, 2),List(A, B))
と同様に
... = (List(2, 1),List(B, A))
この背後にあるストレージ関連の理由は想像できますが (たとえば、HashMaps を考えてみてください)、皆さんはこの動作についてどのように考えているのでしょうか。Map.unzip メソッドのユーザーには、アイテムが同じペアの順序で返されたように見えるかもしれません (そして、これはおそらくほとんどの場合そうであるに違いありません)。ライブラリ ユーザーのコード。
おそらく、その動作は付属の scaladoc でより明示的に表現する必要がありますか?
編集: マップを順序付けられたコレクションと呼んでいないことに注意してください。解凍後のシーケンスの「一致」のみに関心があります。つまり、
val (keys, values) = someMap.unzip
すべての i について、(keys(i), values(i)) が元のマッピングの要素であることが保持されます。