2

我需要计算我在 Map 中的整数和浮点数,就像Map[String, List[(Int, String, Float)]]

数据来自读取文件 - 例如里面的数据看起来有点像(但是还有更多的路线):

Cycle Route (City),1:City Centre :0.75f,2:Main Park :3.8f,3:Central Station:2.7f,4:Modern Art Museum,5:Garden Centre:2.4f,6:Music Centre:3.4f

地图被拆分,因此 String 是路线的名称,而 List 是其余数据。

我希望它计算每条路线的“检查点”数量和每条路线的总距离(即浮动),然后打印出例如 Oor Wullie Route 有 6 个检查点,总距离为 18.45 公里

我猜我需要使用 afoldLeft但是我不确定该怎么做?

我以前做过的一个简单折叠的例子,但不确定如何将一个应用于上述场景?

val list1 = List.range(1,20)

def sum(ls:List[Int]):Int = {
  ls.foldLeft(0) { _ + _}
}
4

1 回答 1

3

您可以通过折叠来做到这一点,但 IMO 是不必要的。

您只需获取列表的大小即可知道检查点的数量(假设列表中的每个条目都是一个检查点)。

要计算总距离,您可以执行以下操作:

def getDistance(list: List[(Int, String, Float)]): Float = 
  list
    .iterator // mapping the iterator to avoid building an intermediate List instance
    .map(_._3) // get the distance Float from the tuple
    .sum // built-in method for collections of Numeric elements (e.g. Float)

然后得到你的打印输出,如:

def summarize(routes: Map[String, List[(Int, String, Float)]]): Unit =
  for { (name, stops) <- routes } {
    val numStops = stops.size
    val distance = getDistance(stops)
    println(s"$name has $numStops stops and total distance of $distance km")
  }

如果您真的想同时计算numStopsdistancevia foldLeft,Luis 对您的问题的评论就是这样做的方法。

编辑- 根据 Luis 的要求,将他的评论放在这里并稍微清理一下:

stops.foldLeft(0 -> 0.0f) { 
   // note: "acc" is short for "accumulated"
   case ((accCount, accDistance), (_, _, distance)) => 
     (accCount + 1) -> (accDistance + distance) 
}
于 2020-04-15T15:58:49.307 回答