3

先日、なぜ 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)) が元のマッピングの要素であることが保持されます。

4

4 に答える 4

3

実際、あなたが挙げた例は起こりません。はMap常にペアごとに解凍されます。Iterable順序を保証しないあなたの声明は、完全に真実ではありません。any given が順序を保証する必要はないと言った方が正確ですIterableが、これは実装に依存します。. _ Map.unzip_ ソースMap読んで、これが事実であることを確認できます。GenericTraversableTemplate

于 2011-03-31T15:41:26.673 に答える
3

の説明を展開するunzipと、答えが得られます。

definition classes: GenericTraversableTemplate

つまり、 に特化していませんMap

ただし、あなたの議論は健全です。あなたの推論で拡張チケットを開けば、あなたの願いが叶うかもしれません. 特にパッチを作成する場合は特に、そうすることで Scala コレクションについてさらに多くのことを学ぶことができます。

于 2011-03-31T15:15:21.620 に答える
2

通常、マップには自然な順序はありません。順序付けされていないコレクションです。キーがたまたま自然な順序であるという事実は、一般的なケースを変更しません。

(ただし、Map にメソッドがある理由を説明するには途方に暮れていzipWithIndexます。これは、私の主張に対する反論を提供します。他のコレクションとの一貫性のためにあると思います。また、インデックスを提供しますが、それらがメソッドであることが保証されているわけではありません以降の呼び出しでも同じです。)

于 2011-03-31T14:53:41.107 に答える
0

LinkedHashMap または LinkedHashSet を使用する場合、イテレータは元の挿入順序でペアを返すことになっています。他の HashMaps は、ええ、あなたには制御できません。挿入の元の順序を保持することは、UI コンテキストで非常に便利です。たとえば、型を変更せずに、Web アプリケーションの任意の列でテーブルを並べ替えることができます。

于 2011-03-31T20:29:30.307 に答える