Algorithm 从映射[Scala]获取某些键的值之和
如何以更高效和优化的方式从地图中获取特定键的值之和 例如:Algorithm 从映射[Scala]获取某些键的值之和,algorithm,scala,dictionary,key-value,Algorithm,Scala,Dictionary,Key Value,如何以更高效和优化的方式从地图中获取特定键的值之和 例如: var myMap = "SOSSPSSQSSOR".groupBy(identity).mapValues(_.size).toMap >>myMap: scala.collection.immutable.Map[Char,Int] = Map(Q -> 1, P -> 1, R -> 1, O -> 2, S -> 7) myMap.sumExcludingValuesFor("S,O"
var myMap = "SOSSPSSQSSOR".groupBy(identity).mapValues(_.size).toMap
>>myMap: scala.collection.immutable.Map[Char,Int] = Map(Q -> 1, P -> 1, R -> 1, O -> 2, S -> 7)
myMap.sumExcludingValuesFor("S,O")
def sumExcludingValuesFor(s:String):Int = {
//return the sum of the values for keys except S, O
}
我迄今为止的执行情况:
var charMap = "SOSSPSSQSSOR".toString.groupBy(identity).mapValues(_.size).toMap
var excludeChar = Set('S','O')
var mapExcludingSO = charMap.filterKeys { excludeChar.contains(_) == false }
println(mapOnlySO.values.toList.sum)
但我们正在寻找比这更好的实现
非常感谢您的帮助 一旦隔离了感兴趣的键,就不用用它们构建一个新的
映射
,而是使用它们直接访问要求和的值
val charMap = "SOSSPSSQSSOR".groupBy(identity).mapValues(_.length)
charMap.keySet.diff("SO".toSet).foldLeft(0)(_ + myMap(_)) // res0: Int = 3
一旦您隔离了感兴趣的键,就可以使用它们直接访问要求和的值,而不是用它们构建一个新的
映射
val charMap = "SOSSPSSQSSOR".groupBy(identity).mapValues(_.length)
charMap.keySet.diff("SO".toSet).foldLeft(0)(_ + myMap(_)) // res0: Int = 3
您的实现很好。通过消除中间集合和一些不必要的遍历和键查找,您可能会得到一点小小的改进,但对于几乎所有实际目的来说,这都是一种过分的做法:
input
.groupBy(identity)
.foldLeft(0) {
case (s, ("S"|"O", _)) => s
case (s, (_, v)) => s + v.size
}
您的实现很好。通过消除中间集合和一些不必要的遍历和键查找,您可能会得到一点小小的改进,但对于几乎所有实际目的来说,这都是一种过分的做法:
input
.groupBy(identity)
.foldLeft(0) {
case (s, ("S"|"O", _)) => s
case (s, (_, v)) => s + v.size
}
一个经常被忽略的事实是,可以将Scala集合用作函数
Seq[A]
是Int=>A
(部分,按索引)
Set[A]
是A=>Boolean
(成员资格检查)
Map[K,V]
是K=>V
(部分)
允许您编写:
myMap.keysIterator.filterNot("SO".toSet).map(myMap).sum
它还将避免中间集合,因为中间集合是基于迭代器的一个经常被忽略的事实是,您可以将Scala集合用作函数
Seq[A]
是Int=>A
(部分,按索引)
Set[A]
是A=>Boolean
(成员资格检查)
Map[K,V]
是K=>V
(部分)
允许您编写:
myMap.keysIterator.filterNot("SO".toSet).map(myMap).sum
它还将避免中间集合,因为它是基于迭代器的
您自己的实现遇到了什么问题?“一种比什么更有效、更优化的方式”@Dima,正如您所见,我已经编辑了我的问题,以显示我的实现。我真的不明白为什么这个问题被否决了。但由于我是scala的新手,请随时纠正我。您的问题被否决了,因为SO不是“免费编写代码”资源。它不是一个进行一般代码检查的地方(如果您对此感兴趣,请查看)。一个好的SO问题是就一个具体问题寻求具体建议。您自己的实现有哪些问题?“一种比什么更有效、更优化的方式”@Dima,正如您所见,我已经编辑了我的问题,以显示我的实现。我真的不明白为什么这个问题被否决了。但由于我是scala的新手,请随时纠正我。您的问题被否决了,因为SO不是“免费编写代码”资源。它不是一个进行一般代码检查的地方(如果您对此感兴趣,请查看)。一个好的SO问题是一个就具体问题寻求具体建议的问题!如果可能的话,请你投票支持我的问题好吗?!非常感谢。你认为建两套新地图比建一张新地图好吗?:)工作很有魅力!如果可能的话,请你投票支持我的问题好吗?!非常感谢。你认为建两套新地图比建一张新地图好吗?:)