遍历使用Scala设置元素并使用它们作为来自散列映射的键获取值

时间:2016-08-25 19:11:42

标签: scala

我正在尝试使用使用所有文件的第一列创建的集合,并使用第一列作为键而第二列作为值为每个文件创建hashmap。

使用此Set,我想检查hashmap的值,但如果该hashfile的hashmap中没有这样的键,则需要在新的hashmap中将“0”作为该键的值。它需要为每个文件都有新的hashmap。

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

例如文件a,

#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 个答案:

答案 0 :(得分:1)

过度担心文件的组成部分,你的生活过于复杂。要以“功能”的方式思考,打破这一部分:所有文件功能需要做的是生成两个可以使用的键值对映射。

现在,从这些假设开始,你的程序的其余部分很简单:

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