我有一个包含以下数据的列表。我必须比较列表的元素并创建具有指定条件的 map 。 SFTP.csv 应该与其他元素一样映射到/dev/sftp/SFTP_schema.json。
List[String] = List(
"/dev/sftp/SFTP.csv" ,
"/dev/sftp/test_schema.json" ,
"/dev/sftp/SFTP_schema.json",
"/dev/sftp/test.csv"
)
我有一个很大的集合,什么是最快的方法?
最佳答案
那么,您基本上想要反转 map.flatMap{ case (k, v) => List(k, v)) }
?看起来很有趣……这个怎么样?:
val input = List(
"/dev/sftp/SFTP.csv" ,
"/dev/sftp/test_schema.json" ,
"/dev/sftp/SFTP_schema.json",
"/dev/sftp/test.csv"
)
val res = input.
groupBy(s => s.
split("/").
last.
replaceAll("\\.csv","").
replaceAll("_schema\\.json","")
).
map {
case (k, v1 :: v2 :: Nil) =>
if (v1.endsWith("csv")) (v1, v2)
else (v2, v1)
case sthElse => throw new Error(
"Invalid combination of csv & schema.json: " + sthElse
)
}
println(res)
产生:
// Map(
// /dev/sftp/SFTP.csv -> /dev/sftp/SFTP_schema.json,
// /dev/sftp/test.csv -> /dev/sftp/test_schema.json
// )
作为方法:
def invertFlatMapToUnionKeyValue(input: List[String]): Map[String, String] = {
input.
groupBy(s => s.split("/").last.
replaceAll("\\.csv","").
replaceAll("_schema\\.json",""
)).
map {
case (k, v1 :: v2 :: Nil) =>
if (v1.endsWith("csv")) (v1, v2)
else (v2, v1)
case sthElse => throw new Error(
"Invalid combination of csv & schema.json: " + sthElse
)
}
}
关于algorithm - 比较列表的元素并根据 Scala 中的逻辑创建 [键值对或映射],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49035957/