2016-08-25 3 views
1

Ich versuche, ein Set mit ersten Spalte aller Dateien zu erstellen und hashmap für jede Dateien mit ersten Spalte als Schlüssel und die zweite Spalte als Wert zu erstellen .Traverse Setzen Sie Elemente und erhalten Sie Werte als Schlüssel aus einer Hashmap mit Scala

Mit diesem Set möchte ich die Werte für die Hashmap überprüfen, aber wenn in dieser hashmap für diese Datei kein solcher Schlüssel vorhanden ist, muss er "0" als Werte für diesen Schlüssel in der neuen Hashmappe angeben. Es muss für jede Datei eine neue Hashmap haben.

//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)     
    } 

Zum Beispiel eine Datei,

#comments 
ABC 2 
ABN 7 
CVF 9 

Datei b

#Comments 
# 
# 
ABC 1 
DFG 2 
CVF 3 

Ausgang:

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

gewünschte Ausgabe:

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

Antwort

1

Sie verkomplizieren Ihr Leben, indem Sie sich zu sehr um die Dateikomponente sorgen. Wenn Sie in einem "funktionalen" Stil denken, brechen Sie diesen Teil ab: Die gesamte Dateifunktionalität muss zwei Zuordnungen von Schlüssel/Wert-Paaren erzeugen, mit denen Sie arbeiten können.

Jetzt, mit denen, wie der Annahme ausgehend, der Rest des Programms ist einfach:

// 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

Nathaniel, ich Ihre Antwort zu schätzen wissen. Obwohl es mir nicht die gewünschte Leistung bringt, wird es wertvoll sein, weitere Fortschritte zu machen. Ich muss mich um die Dateien kümmern, da ich versuche, eine Python-Skriptfunktionalität zu replizieren, um Scala zu lernen. – deepseas

+0

Eigentlich funktioniert es. Mein Fehler. Sie müssen nur die Datei "file1.getOrElse (key, 0))" in "file.getOrElse (key, 0))" in def def ProduceMap ändern. – deepseas

+1

@deepseas Ich sage nicht, importieren Sie nicht die Dateien, ich sage, erhalten Sie zuerst eine Kartendarstellung der Dateien, und dann sorgen Sie sich über die Manipulation von ihnen, anstatt beide auf einmal zu tun. –

Verwandte Themen