algorithm - 比较列表的元素并根据 Scala 中的逻辑创建 [键值对或映射]

标签 algorithm scala scala-collections

我有一个包含以下数据的列表。我必须比较列表的元素并创建具有指定条件的 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/

相关文章:

algorithm - 在 O(n) 时间内排序?

java计算怀孕算法

scala - 使用 Maven 构建 SBT 项目

斯卡拉这是什么意思? "{/* compiled code */}"

scala - 如何将此 SetLike 集合从 Scala 2.12 转换为 2.13?

scala - O(1) 从 mutable.Map 到 immutable.Map 的转换?

java - 使用中值规则的 QuickSort 错误

algorithm - VP9中使用的快速运动估计算法?

scala - Scala 编译器是否适用于 UTF-8 编码的源文件?

scala - 将工作分配给多个核心 : Hadoop or Scala's parallel collections?