Intellij Idea 在Map中查找最大增加值

swvgeqrz  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(135)

我的Scala之旅刚刚开始。我试图找到并比较给定数据集的最大增加值--类型Map(String,List[Int])。程序应该计算List的最后7个值和每行的最后一个值之间的增加(或减少),然后打印整个Map的最大增加行。例如,给定以下数据集:

DATASET
SK1, 9, 7, 2, 0, 7, 3, 7, 9, 1, 2, 8, 1, 9, 6, 5, 3, 2, 2, 7, 2, 8, 5, 4, 5, 1, 6, 5, 2, 4, 1

SK2, 0, 7, 6, 3, 3, 3, 1, 6, 9, 2, 9, 7, 8, 7, 3, 6, 3, 5, 5, 2, 9, 7, 3, 4, 6, 3, 4, 3, 4, 1

SK3, 8, 7, 1, 8, 0, 5, 8, 3, 5, 9, 7, 5, 4, 7, 9, 8, 1, 4, 6, 5, 6, 6, 3, 6, 8, 8, 7, 4, 0, 7

程序应计算每一行的增量:

SK1 = 1 "last value" - 5 "7th last value" = - 4
SK2 = 1 "last value" - 4 "7th last value" = - 3
SK3 = 7 "last value" - 6 "7th last value" = 1

程序应打印SK 3 - 0,因为是最高增量。
程序可以计算每行的增量,但目前需要SK输入,方法如下:
第一次
然后在程序菜单中使用以下命令调用这两个方法:
第一个
我试着调用下面的方法来计算每行的上升,但似乎没有效果:

def menuShowStocks(f: () => Map[String, List[Int]]) = {
    val highestIncrese = 0
    f() foreach { case (x, y) => println(s"$x: $y") }
}
snvhrwxg

snvhrwxg1#

常见的做法是:

  • 首先Map每一行,计算得分
  • 使用聚合函数选择所需的行

我们开始吧:

scala> val dataSet = Map(
     |   "SK1" -> List(9, 7, 2, 0, 7, 3, 7, 9, 1, 2, 8, 1, 9, 6, 5, 3, 2, 2, 7, 2, 8, 5, 4, 5, 1, 6, 5, 2, 4, 1),
     |   "SK2" -> List(0, 7, 6, 3, 3, 3, 1, 6, 9, 2, 9, 7, 8, 7, 3, 6, 3, 5, 5, 2, 9, 7, 3, 4, 6, 3, 4, 3, 4, 1),
     |   "SK3" -> List(8, 7, 1, 8, 0, 5, 8, 3, 5, 9, 7, 5, 4, 7, 9, 8, 1, 4, 6, 5, 6, 6, 3, 6, 8, 8, 7, 4, 0, 7)
     | )
val dataSet: Map[String, List[Int]] = Map(SK1 -> List(9, 7, 2, 0, 7, 3, 7, 9, 1, 2, 8, 1, 9, 6, 5, 3, 2, 2, 7, 2, 8, 5, 4, 5, 1, 6, 5, 2, 4, 1), SK2 -> List(0, 7, 6, 3, 3, 3, 1, 6, 9, 2, 9, 7, 8, 7, 3, 6, 3, 5, 5, 2, 9, 7, 3, 4, 6, 3, 4, 3, 4, 1), SK3 -> List(8, 7, 1, 8, 0, 5, 8, 3, 5, 9, 7, 5, 4, 7, 9, 8, 1, 4, 6, 5, 6, 6, 3, 6, 8, 8, 7, 4, 0, 7))

scala> val highestIncrease = dataSet
     |   .toSeq
     |   .map { case (name, ints) =>
     |     name -> (ints.last - ints(ints.length - 7))
     |   }
     |   .maxBy(_._2)
val highestIncrease: (String, Int) = (SK3,1)

一些注意事项:

  • 首先将Map转换为一个带有toSeq的Seq。在Map上进行Map是完全可能的,但有点复杂。最好将此留到以后学习。这将生成一个Seq[(String, List[Int])]
  • 使用map,我们迭代Seq中的元组。这使用模式匹配来提取变量nameints
  • 同时,我们使用->操作符来构造一个新的包含两个元素的元组,这样我们就可以保留行的名称。
  • 方法maxBy接受一个函数来获取一个值。表达式_._2(等价于x => x._2)是一个函数,它给出每个元组中的第二个值。

下面可以打印出我们所发现的东西的名称:

println(s"The highest increase is in dataset ${highestIncrease._1} and is ${highestIncrease._2}.")

相关问题