Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 从映射[Scala]获取某些键的值之和_Algorithm_Scala_Dictionary_Key Value - Fatal编程技术网

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问题是一个就具体问题寻求具体建议的问题!如果可能的话,请你投票支持我的问题好吗?!非常感谢。你认为建两套新地图比建一张新地图好吗?:)工作很有魅力!如果可能的话,请你投票支持我的问题好吗?!非常感谢。你认为建两套新地图比建一张新地图好吗?:)