我正在尝试使用使用所有文件的第一列创建的集合,并使用第一列作为键而第二列作为值为每个文件创建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)
答案 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)