【问题标题】:How to sum number of Ints and Number of Floats within a List - Scala如何对列表中的整数数量和浮点数求和 - Scala
【发布时间】:2020-04-16 05:53:16
【问题描述】:

我需要计算我在 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.45km

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

我之前做过的简单折叠示例,但不确定如何将其应用于上述场景?

val list1 = List.range(1,20)

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

【问题讨论】:

  • @jwvh 对不起,你是对的,我的错!已在上面进行了编辑。

标签: scala functional-programming foldleft


【解决方案1】:

你可以通过折叠来做到这一点,但 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")
  }

如果您真的想通过foldLeft 计算numStops 和distance,Luis 对您的问题的评论就是这样做的方法。

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

stops.foldLeft(0 -> 0.0f) { 
   // note: "acc" is short for "accumulated"
   case ((accCount, accDistance), (_, _, distance)) => 
     (accCount + 1) -> (accDistance + distance) 
}

【讨论】:

  • 请注意,List 上的size 是 O(n) 这会遍历列表两次。顺便说一句,如果你能在你的答案中包含我的评论,我希望它 (我的意思是,把代码缩进) 这样我就可以删除它,特别是因为我有一个错字并且浮动是第三个位置,而不是第二个。
  • @LuisMiguelMejíaSuárez 好的,我已经添加了。我同意使用 size 可能会慢一点,但我认为差异可以忽略不计,特别是考虑到 OP 的用例,列表不太可能很长。这就是“迭代一次,一步做两件事”和“迭代两次,一步做一件事”之间的区别。
  • @LuisMiguelMejíaSuárez 感谢您的解决方案 - 我正在尝试将其实现到菜单中,因此当用户选择总距离和阶段的菜单选项时,他们将获得计算的输出。当我实施您的解决方案时,我收到以下错误:错误:(135、19)类型不匹配;发现 : (Int, Float) required: Float stops.foldLeft(0 -> 0.0f) { 你知道我该如何解决这个问题吗?
  • 您是否在我在回答中给出的getDistance 函数中执行foldLeft?这被标记为具有一个 Float 返回类型,它只是距离值,而 foldLeft 返回一个 (Int, Float) ,它既是计数也是距离。
  • @Dylan 这正是我所做的,我现在将其更改为 (Int, Float) 并且错误消失了谢谢!!我在打印语句时遇到问题 - 我尝试以与您给出示例类似的方式实现它,但它似乎不喜欢它?很抱歉所有问题很明显我对此很陌生!
猜你喜欢
  • 2015-12-31
  • 2021-12-22
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多