【问题标题】:How to access Tuples of a List in a Map in Scala?如何在 Scala 的地图中访问列表的元组?
【发布时间】:2019-04-09 07:57:12
【问题描述】:

我有一张格式图

scala.collection.mutable.Map[String,List[(Int, Int, Int)]]

并且我希望能够访问各个 Int 的。 Map 中的数据格式始终为

Mon-18-June-2018,1:10:5,2:20:10,3:30:15,4:40:20,5:50:25

其中日期是 Map 的键,每组三个数字是 (Int, Int, Int)

到目前为止,我已经能够以这种格式打印地图

Mon-18-June-2018
List((1,10,5), (2,20,10), (3,30,15), (4,40,20), (5,50,25))

使用下面的代码

map.keys.foreach{i =>
    println(i)
    println(map(i))    

我希望能够访问元组中的各个值。例如,我希望能够将每个元组的每个第二个和第三个值加在一起
(1,10,5)
(2,20,10)
(3,30,15)
(4,40,20)
(5,50,25)

得到
(6,150,75)

我该怎么做?

【问题讨论】:

标签: scala collections iterator


【解决方案1】:

您可以使用模式匹配来访问元组的元素。

val dateMap :Map[String,List[(Int, Int, Int)]] =
  Map("Mon-18-June-2018" ->
    List((1,10,5), (2,20,10), (3,30,15), (4,40,20), (5,50,25)))

dateMap.values.map(_.fold((1,0,0)){case ((a,b,c),(x,y,z)) => (a+1,b+y,c+z)})
//res0: Iterable[(Int, Int, Int)] = List((6,150,75))

【讨论】:

    【解决方案2】:

    最简单的方法是:

    val yourMap : Map[String,List[(Int, Int, Int)]] = Map("Mon-18-June-2018" -> List((1,10,5), (2,20,10), (3,30,15), (4,40,20), (5,50,25)))
    yourMap.map(x=> (x._2.length+1,x._2.map(_._2).sum,x._2.map(_._3).sum))
    

    您可以在此处找到更多表格:Scala: How to sum a list of tuples

    【讨论】:

      【解决方案3】:

      要获取列表中的每个单独的值,您可以在其中.map

      要获取元组的每个元素,请使用tuple._1tuple._2tuple._3 等。

      在您的情况下,要将元组的所有值加在一起,您可以执行以下操作:

      val m = scala.collection.mutable.Map[String,List[(Int, Int, Int)]](
        "Mon-18-June-2018" -> List((1, 10, 5), (2, 20, 10), (3, 30, 15), (4, 40, 20), (5, 50, 25))
      )
      
      m.map {
        // get keys and values
        case (k, v) =>
          // construct a Tuple of all of the sums
          (v.map(_._1).sum, v.map(_._2).sum, v.map(_._3).sum)
      }
      // ArrayBuffer((15,150,75))
      

      这将创建一个元组列表 ((Int, Int, Int)),其中每个元组对应于原始 Map 中的一个键。您甚至可以通过执行以下操作来保留原始 Map 的键:

      m.map{
        // get keys and values
        case (k, v) =>
          // "x -> y" creates a Tuple, or in this case a Map
          k -> (v.map(_._1).sum, v.map(_._2).sum, v.map(_._3).sum)
      }
      // Map(Mon-18-June-2018 -> (15,150,75))
      

      【讨论】:

      • 这没有给出预期的结果 (6,150,75)。
      • 当我评论这个问题时,从来没有解释过 OP 是如何获得第一个 Tuple 值的 6 的。我以为这是一个错字。您如何建议他们期望获得 6 个?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      相关资源
      最近更新 更多