2016-08-25 10 views
1

すべてのファイルの最初の列を使用して作成したセットを使用し、最初の列をキーに、 。Scverseを使用してハッシュマップのキーとしてキーを使用して値を取得する

このセットを使用して、ハッシュマップの値をチェックしたいが、そのファイルのハッシュマップにそのようなキーがない場合は、そのキーの値として新しいハッシュマップに「0」を入れる必要があります。各ファイルに新しいハッシュマップが必要です。

//Set for storing 
var ids : Set[String] = collection.immutable.HashSet() 
//Hashmap for storing 
    var id:Map[String,String] = collection.immutable.Map() 

    for (arg<-args){ 
    ids ++= Source.fromFile(arg) 
    .getLines() 
    .filterNot(_.trim.startsWith("#")) 
    .map(_.split("\t")(0)) 
    } 

    //Create hash map for each file 
    for (arg<-args){ 
     id ++= Source.fromFile(arg).getLines() 
     .filterNot(_.trim.startsWith("#")) 
     .map { l => 
     val Array(k,v1,_*)= l.split("\t") 
     k-> (v1)}.toMap 
     val filtered = id.filter(i =>  
     ids.contains(i._1)) 
     println(filtered)     
    } 

例えばファイル、

#comments 
ABC 2 
ABN 7 
CVF 9 

ファイルB

#Comments 
# 
# 
ABC 1 
DFG 2 
CVF 3 

出力:

Map(ABC -> 2, ABN -> 7, CVF -> 9) 
Map(ABC -> 1, ABN -> 7, CVF -> 3, DFG -> 2) 

所望の出力:

Map(ABC -> 2, ABN -> 7, CVF -> 9,DFG -> 0) 
Map(ABC -> 1, ABN -> 0, CVF -> 3, DFG -> 2) 

答えて

1

あなたは、そのファイルコンポーネントについて過度に心配することによって人生を複雑にしています。 「機能的」なスタイルで考えるには、その部分を切り離してください。ファイル機能が必要とするのは、操作可能なキーと値のペアの2つのマップを生成することだけです。

さて、前提としてそれらから始まる、あなたのプログラムの残りの部分は簡単です:

// Start with these 
val file1 = Map("ABC" -> 2, "ABN" -> 7, "CVF" -> 9) 
val file2 = Map("ABC" -> 1, "DFG" -> 2, "CVF" -> 3) 

// Get all their keys 
val keys = file1.keySet ++ file2.keySet 

// For each file, generate a map that has a value for all the keys 
def produceMap(file: Map[String, Int], keyset: Set[String]): Map[String, Int] = { 
    val keyValuePairs = for { 
    key <- keyset // Iterates through all the keys 
    } yield (key, file.getOrElse(key, 0)) // getOrElse is useful for filling in empty values 
    keyValuePairs.map{case (a, b) => (a -> b)}.toMap // Converts the Seq[(String, Int)] to a proper map. 
} 

val map1 = produceMap(file1, keys) // Map(ABC -> 2, ABN -> 7, CVF -> 9, DFG -> 0) 
val map2 = produceMap(file2, keys) // Map(ABC -> 1, ABN -> 0, CVF -> 3, DFG -> 2) 
+0

ナサニエル、私はあなたの応答を感謝しています。それは私に望ましい出力を与えませんが、それ以上の進歩をする価値があります。 Scalaを学ぶためのPythonスクリプト機能を複製しようとしているので、ファイルについて心配する必要があります。 – deepseas

+0

実際に動作します。私の悪い。 ProduceMapのdefファイルの "file1.getOrElse(key、0))"を "file.getOrElse(key、0)"に変更するだけです。 – deepseas

+1

@deepseas私はファイルをインポートしないと言っているわけではありません。ファイルのマップ表現を最初に取得し、一度に両方を行うのではなく、それらを操作することを心配しています。 –

関連する問題