7

私は次のリストを持っています:

case class myPair(ids:Int,vals:Int)

val someTable = List((20,30), (89,90), (40,65), (45,75), (35,45))

val someList:List[myPair] =
  someTable.map(elem => myPair(elem._1, elem._2)).toList

すべての「id」> 45 をフィルタリングしたいと思います。パターンマッチングを使用してこの記事フィルターのようなものを試しました):

someList.filter{ case(myPair) => ids >= 45 }

しかし、成功しませんでした。あなたの助けに感謝

4

4 に答える 4

18

パターン マッチングはまったく必要ありません。型はコンパイル時に認識されます。

someList.filter(_.ids >= 45)

またはもう少し冗長/読みやすい:

someList.filter(pair => pair.ids >= 45)
于 2013-02-18T17:10:26.133 に答える
6

パターン マッチングを使用したもう 1 つのバリアントを次に示します。

someTable collect {case (i, v) if i > 45 => MyPair(i, v)}

collect は、フィルター操作とマップ操作を組み合わせたものです。

于 2013-02-18T21:36:01.670 に答える
6

あなたは次のように意味します:

someList.filter{ case MyPair(ids,vals) => ids >= 45 }

に名前が変更myPairされMyPair、小文字で始まる識別子は変数と見なされ、上記のidsおよびvalsによく似ています。-- 実際には、これは正しくありません。@RandallSchulz のコメントを見てください。

さらに進む(1):

val someList = someTable.map(case (ids,vals) => MyPair(ids,vals)).toList

さらに (2):

val someList = someTable.map(elem => MyPair.tupled(elem)).toList

もっと(3):

val someList = someTable.map(MyPair.tupled).toList

もちろん(1)だけはパターンマッチです。(2) と (3) の引数MyPair.apply(Int,Int)を Tuple[Int,Int] に変換しています。

于 2013-02-18T17:29:28.930 に答える
0
case class myPair(ids:Int,vals:Int)

val someTable = List((20,30), (89,90), (40,65), (45,75), (35,45))

val someList:List[myPair] = for( elem <- someTable; if elem._1 > 45) yield myPair(elem._1, elem._2)

どちらが与える

someList: List[myPair] = List(myPair(89,90))
于 2013-02-18T22:36:09.050 に答える