【问题标题】:create two immutable data structure in one go using scala for comprehension or any other feature使用 scala 一次性创建两个不可变数据结构以进行理解或任何其他功能
【发布时间】:2015-10-11 16:38:35
【问题描述】:

我在包含四列 colA、colB、colC、colD 的文件中有条目。我需要读取该文件并创建两个不可变的数据结构映射。

colA -> (colB, colC, colD)  
colB -> (colA, colC, colD)  

有什么方法可以一次性完成。使用理解,我可以创建一个数组,在遍历它之后,我可以创建两个地图。但这似乎不是正确有效的方法。请指导我完成。
那么我正在做的如下

case class Mapping(col1: String, col2: String, col3: String, col4: String)
val columnList = for {
    line <- io.Source.fromInputStream(getClass.getClassLoader.getResourceAsStream(file)).getLines() if (!(line startsWith ("#")))
    val splittedArray: Array[String] = line.replaceAll(" ", "").split(",")
    if (splittedArray.length == 4) 
  } yield Mapping(splittedArray(0), splittedArray(1), splittedArray(2), splittedArray(3))
val map1 = columnList.map(mapping=> (mapping.col1, mapping)).toMap
val map2 = columnList.map(mapping=> (mapping.col2, mapping)).toMap

【问题讨论】:

    标签: scala data-structures scala-collections scala-2.10


    【解决方案1】:

    折叠比映射更灵活,因此您可以使用fold 一次构建两个集合:

    val v = Vector(
      Vector(1,2,3,4),
      Vector(5,6,7,8),
      Vector(9,10,11,12))
    val (m1, m2) = v.foldLeft((Map.empty[Int,(Int,Int,Int)],Map.empty[Int,(Int,Int,Int)])) {
      case ((x,y), Vector(a,b,c,d)) =>
        (x + (a -> (b,c,d)), y + (b -> (a,c,d)))
    }
    
    println(m1)
    // Map(1 -> (2,3,4), 5 -> (6,7,8), 9 -> (10,11,12))
    println(m2)
    // Map(2 -> (1,3,4), 6 -> (5,7,8), 10 -> (9,11,12))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多