【问题标题】:Getting value from Hashmap with get or contains with apply method使用 get 或 contains 使用 apply 方法从 Hashmap 获取值
【发布时间】:2015-11-25 11:37:11
【问题描述】:

从哈希图中获取值的更好方法是哪一种?

第一个选项:

val hm = HashMap(...)
if(hm.contains(keyWhichIsDefinitelyInTheKeys)){
  hm(keyWhichIsDefinitelyInTheKeys)  ... //do stuff
} else {
 ... //do stuff
}

第二个选项:

hm.get(keyWhichIsDefinitelyInTheKeys) match {
    case Some => ...
    case None => ...
} // do stuff

【问题讨论】:

  • 也许你应该重命名keyWhichIsDefinitelyInTheKeys,因为这会让人们认为hm.get(keyWhichIsDefinitelyInTheKeys) 总是返回非空值

标签: scala scala-collections


【解决方案1】:

这对某些键更好:

 hm.getOrElse(key, defaultValue)

 //or

 hm.getOrElse(key, sys.error(s"unexpected key: $key"))

 //or more generally

 hm.get(key).map(v => doStuff(v)).getOrElse(doOtherStuff)

您不能 100% 确定 Map 包含密钥,除了一些类型级别的保护(编译时检查);但是,如果你这样做了,那么if 无论如何也帮不了你,所以只需:

 hm(keyWhichIsDefinitelyInTheKeys)

【讨论】:

  • 问题是更建议使用哪一个:检查 hashmap 是否包含键或使用 get ?
  • @stsatlantis map + getOrElse 为您提供了一种处理选项的便捷方式(包括来自地图的结果)。但是你的问题是自相矛盾的,因为你的变量名是keyWhichIsDefinitelyInTheKeys,这意味着你根本不需要检查值是否在地图中
  • @stsatlantis 我的意思是,您实际上是在询问 - if(contains(keyWhichIsAlwaysContained)),与 if(true) 相同
【解决方案2】:

正如 dk14 所说,如果您不确定 Map 是否包含密钥,您最好使用返回 Optionget

如果Map 中不存在密钥,您可以使用getOrElse 设置默认值。

如果您没有要设置的默认值,如果Option 包含Some 而不是None,则可以使用for 理解

scala> val hm = Map( 1 -> "Hello")
hm: scala.collection.immutable.Map[Int,String] = Map(1 -> Hello)

scala> for (i <- hm.get(2) ) { println(i) }

scala> for (i <- hm.get(1) ) { println(i) }
Hello

【讨论】:

    【解决方案3】:

    在性能方面:

    有一个测试码:http://pastebin.com/TbM82S7H

    这是它的输出:http://pastebin.com/7An1DZw5

    (cpu: i5 4590K)

    这两种调用都没有更好的性能......

    【讨论】:

      猜你喜欢
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 2011-12-28
      相关资源
      最近更新 更多