2016-11-14 4 views
0

Map[String, String]のマップが与えられています。マップ機能のキーをスカラーでスキップする方法

私はあなたが...あなたのcase句に

case (k,v) if v != "1" => // apply some transformation on it 
case (k,v) => (k,v) // leave as is 

を「ガード」を置く...または単に残すことができるマップ

val m = Map("1"-> "1", "2"-> "2") 
    m.map[(String, String), Map[String, String]].map{ 
     case(k,v)=> 
     if (v == "1") { 
      // Q1: how to skip this key 
      // Do not need to return anything 
     } else { 
      // If the value is value that I want, apply some other transformation on it 
      (k, someOtherTransformation(v)) 
     } 
    } 
+0

あなたが元とは異なるサイズになるように結果が反復可能かどう 'fold' /' reduction'の代わりに、 'map'を使用してください。 – Carcigenicate

+0

これはリストではありませんか?それは地図ですか?たぶん私はあなたを誤解している – samol

+0

私のコメントを修正しました。 – Carcigenicate

答えて

1

からキーをスキップする方法を知りたいです興味のない要素は変更しないでください。

case (k,v) => if (v == "1") (k,v) else // apply some transformation on it 
map

の出力が変更された要素の全て/一部/なしと入力されたコレクションとして新しいコレクション同じサイズです。関数は、いくつかの要素(Mapためのペア)のために定義されていない場合

+0

別のコメント作成者が提案したように、reduce/foldを使用するのはどうですか?それはより良い一般的な慣行ですか? – samol

+0

@samol Scalaに要素を破棄する機能がある場合は、代わりにそれを使用します。すべての言語が標準マップ機能に対応しているわけではありません。 – Carcigenicate

+0

これは達成しようとしていることによって異なります。一般的なルールとして、 'map'はコレクション内のすべての要素に触れたいとき、' collect'は 'map'と似ていますが、選択した要素をタッチ/変更します。新しい/変更されたコレクションが必要な場合は、 'map'、' flatMap'、または 'collect'がツールとなります。一方、コレクションから計算された単一のデータ/情報が必要な場合は、 'fold' /' reduce'ファミリーのものがチケットになります。さまざまなタスクのための異なるツール。 – jwvh

2

.collectはあなたが望むものを正確にやっている、それは、部分関数を受け取り、その要素がドロップされます。

Map("1"-> "1", "2"-> "2").collect { case (k, v) if v != "1" => (k, v * 2) } 
//> scala.collection.immutable.Map[String,String] = Map(2 -> 22) 

ここでは一部機能が定義されていますv != "1"(ガードのため)のため、v == "1"の要素は削除されます。

1

ビクターMorozの答えは、このような場合のために、しかし、あなたはflatMapを使用して、パターンマッチにすぐにスキップするかどうかについて判断を下すことができない場合のために良いです:

Map("1"-> "1", "2"-> "2").flatMap { 
    case (k,v) => 
    val v1 = someComplexCalculation(k, v) 
    if (v1 < 0) { 
     None 
    } else { 
     // If the value is value that I want, apply some other transformation on it 
     Some((k, someOtherTransformation(v1))) 
    } 
} 
1

なぜ.filterNotすべてを削除します望ましくない値(あなたの状態による)、そして.map

サンプルコード:

Map("1"-> "1", "2" -> "2").filterNot(_._2 == "1").map(someFunction) 
//someFunction -> whatever you would implement 
関連する問題