2

これは動機付けの例です。

List((1,2), (2,1), (3,1))

戻りたい:

List((1,2),(3,1))

私はいくつかの方法でこれをやろうとしました。初め:

List((1,2), (2,1), (3,1)) map { case (a,b) => if (a > b) (a,b) else (b,a) } 
distinct

次に、タプルを使用しようとしました:

List((1,2), (3,4), (2,1)) map { t => if (t._1 <= t._2) t else t.swap }

次に、部分関数を少し異なる方法で定義します。

val pf: PartialFunction[(Int,Int), (Int,Int)] = {
  case (i, j) if i >= j => (j, i)
}

List((1,2), (3,4), (2,1)) map pf distinct

定義されている要素にのみ PartialFunction を適用する方法はありますか? または、何らかの方法で PF と Identity を組み合わせます。

4

1 に答える 1

1

完全を期すために別のフォームを次に示します。

List((1,2), (2,1), (3,1)) map { case x@(i,j) => if (i >= j) (j,i) else x } distinct

これは基本的に他のいくつかのフォームと同じです。

定義されている要素にのみ PartialFunction を適用する方法はありますか? または、何らかの方法で PF と Identity を組み合わせます。

はい。applyOrElse.

この場合、部分関数が定義されている場所と定義されていない場所をチェックする理由はほとんどありません。なぜなら、定義されているかどうかをチェックするために必要な作業量は、何をすべきかを理解する前に関数全体がしなければならない作業と同じになるからです (つまり、2 つの要素を比較します)。

でも本当にしたいなら

List((1,2), (3,4), (2,1)) map {x => pf.applyOrElse(x, identity[(Int, Int)])} distinct
于 2014-12-09T17:24:29.073 に答える