0

我有一个很长的条件逻辑。想要有一个有效的方法来做到这一点。

(city, country) match {

("USA","NewYork") => someVal=1.0
("USA","SomeOther")=> someVal =2.0
....
}

我在循环中有这个查找逻辑,我该如何干净地做到这一点。可能是 Scala 中的多键映射或策略模式

4

1 回答 1

1

你有一些方法可以做到这一点。除了使用的一种用途外,您还可以尝试:

val map1: Map[(String, String), Double]
map1((country, city)): Double // or
map1.get((country, city)): Option[Double]

或者

val map2: Map[String, Map[String, Double]]
map2(country)(city): Double
map2.get(country).flatMap(_.get(city)): Option[Double]

哪个更快?我不知道。您必须为您的用例制定基准。Map可能比match没有基准测试要快,但没有人能说出多少。哪个地图更快?map1还是map2?我们可能会猜测,但没有针对您的用例的基准,这只是猜测。

不幸的是,除非你在JMH中运行它并比较结果,否则它可能只是冷 JVM 的结果。

而且,只要您String用作键,就很难提出诸如StrategyGoF 之类的解决方案等,因为它们依赖于能够向类添加一些属性/方法以使计算更便宜和/或依赖于存在有限数量的可能性这一事实解锁了一些优化。

于 2020-04-05T12:19:25.330 回答