加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

有没有办法让Scala HashMap自动初始化值?’

发布时间:2020-12-16 18:25:48 所属栏目:安全 来源:网络整理
导读:我认为可以按如下方式完成 val hash = new HashMap[String,ListBuffer[Int]].withDefaultValue(ListBuffer())hash("A").append(1)hash("B").append(2)println(hash("B").head) 然而,上面打印的非直观值为1.我想 hash("B").append(2) 在幕后做类似以下的事情
我认为可以按如下方式完成

val hash = new HashMap[String,ListBuffer[Int]].withDefaultValue(ListBuffer())
hash("A").append(1)
hash("B").append(2)
println(hash("B").head)

然而,上面打印的非直观值为1.我想

hash("B").append(2)

在幕后做类似以下的事情

if (!hash.contains("B")) hash.put("B",ListBuffer())

解决方法

withDefaultValue每次使用完全相同的值.在您的情况下,它是由每个人共享的相同的空ListBuffer.

如果你使用withDefault,你可以每次生成一个新的ListBuffer,但它不会被存储.

所以你真正喜欢的是一种可以添加默认值的方法.您可以在包装类中创建这样的方法,然后编写隐式转换:

class InstantiateDefaults[A,B](h: collection.mutable.Map[A,B]) {
  def retrieve(a: A) = h.getOrElseUpdate(a,h(a))
}
implicit def hash_can_instantiate[A,B]) = {
  new InstantiateDefaults(h)
}

现在你的代码按照需要工作了(除了额外的方法名称,如果你愿意,可以选择更短的方法名称):

val hash = new collection.mutable.HashMap[
  String,collection.mutable.ListBuffer[Int]
].withDefault(_ => collection.mutable.ListBuffer())

scala> hash.retrieve("A").append(1)

scala> hash.retrieve("B").append(2)

scala> hash("B").head
res28: Int = 2

请注意,解决方案(带隐式)根本不需要知道默认值本身,因此您可以执行此操作一次,然后默认添加内容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读