Scala集合,单键多值

2023-11-22

我有一个父键列表,每个父键可能有零个或多个关联值。我不确定使用哪个集合。

我在用Map[Int,List[String]]

我将地图声明为

var nodes = new HashMap[Int, List[String]]

然后我有两种方法来处理添加新元素。首先是添加新键addNode第二是添加新值addValue。最初,该键没有任何与其关联的值。稍后,在执行过程中,将关联新值。

def addNode(key: Int) = nodes += (key -> "")

def addValue(key: Int, value: String) = ???

我不知道如何实施addValues

Update:

回应 @oxbow-lakes 的回答,这是我收到的错误。请注意,键不需要具有与其关联的值。

scala> var nodes = Map.empty[Int, List[String]]
nodes: scala.collection.immutable.Map[Int,List[String]] = Map()

scala> nodes += (1->null)

scala> nodes += (1 -> ("one" :: (nodes get 1 getOrElse Nil)))
java.lang.NullPointerException
    at .<init>(<console>:9)
    at .<clinit>(<console>)
    at .<init>(<console>:11)
    at .<clinit>(<console>)
    at $print(<console>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704)
    at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920)
    at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43)
    at scala.tools.nsc.io.package$$anon$2.run(package.scala:25)
    at java.lang.Thread.run(Thread.java:680)

更新2:

上面代码的问题在于这一行nodes += (1->null)该密钥应与Nil反而。下面是工作代码。

scala> var nodes = Map.empty[Int, List[String]]
nodes: scala.collection.immutable.Map[Int,List[String]] = Map()

scala> nodes += (1->Nil)

scala> nodes += (1 -> ("one" :: (nodes get 1 getOrElse Nil)))

scala> nodes
res27: scala.collection.immutable.Map[Int,List[String]] = Map(1 -> List(one))

使用多重地图

您可能想使用MultiMap,这是一个可变集合,同构于Map[K, Set[V]]。使用方法如下:

import collection.mutable
val mm = new mutable.HashMap[Int, mutable.Set[String]] with mutable.MultiMap[Int, String]

然后添加节点:

mm addBinding (key, value)

没有多重地图

另一种选择是坚持不可变的价值观。假设您想避免使用lenses (see scalaz),可以按如下方式添加节点:

nodes += (key -> (value :: (nodes get key getOrElse Nil)))

它在这里工作(回应您的评论):

scala> var nodes = Map.empty[Int, List[String]]
nodes: scala.collection.immutable.Map[Int,List[String]] = Map()

scala> def addNode(key: Int, value: String) =
     | nodes += (key -> (value :: (nodes get key getOrElse Nil)))
addNode: (key: Int, value: String)Unit

scala> addNode(1, "Hi")

scala> addNode(1, "Bye")

scala> nodes
res2: scala.collection.immutable.Map[Int,List[String]] = Map(1 -> List(Bye, Hi))

使用 Scalaz

使用 scalaz 库,您可以意识到这只是使用Empty图案:

nodes += (key -> (value :: ~(nodes get key)))

或者你可以利用这样一个事实:Map is a monoid:

nodes = nodes |+| Map(key -> List(value))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala集合,单键多值 的相关文章

随机推荐

  • 使用 C# 中的函数返回两个字符串[重复]

    这个问题在这里已经有答案了 我有一个函数想要返回两个值 这可能吗 这是我的代码 但它似乎不喜欢我想返回两个值 public string PlayerCards string player1C1 string player1C2 gener
  • 无法连接到 Kubernetes 集群中的 mongodb 服务

    我在 Google Cloud 上有一个 Kubernetes 集群 有一个数据库服务 它在 mongodb 部署之前运行 我还有一系列微服务 它们正在尝试连接到该数据存储 然而 他们似乎找不到主人 apiVersion v1 kind S
  • Intellij 13 鼠标悬停解决方案上弹出的自动文档不再起作用[重复]

    这个问题在这里已经有答案了 我一直在使用这个解决方案适用于 IntelliJ 12 用于在鼠标悬停时自动弹出快速文档 但是新版本的 IntelliJ 13 当你设置auto show quick doc true in the idea p
  • Durandal:在合成过程中显示“正在加载...”

    当 activate 方法执行其操作时 我可以轻松地显示加载消息 如下所示 div div class text center style margin 75px i class fa fa spinner fa spin i div di
  • 使用 mamp 在本地测试电子邮件

    首先 我对这种本地主机服务器设置完全陌生 过去几天我一直在试图解决这个问题 但没有运气 我正在开发一个带有电子邮件表单的 php 网站 我在一个MAC using codekit and 免费的MAMP一切正常 现在我的问题是 是否可以在本
  • .Net 超时:WaitForSingleObject 与 Timer

    我正在异步操作 一系列网络 IO 上实现超时 但我不确定哪个 更好 从分配 性能 的角度来看 创建 EventWaitHandle 并使用 RegisterWaitForSingleObject 或者只是创建一个 Timer并使用它的Tic
  • 为什么没有 cv2.waitkey() 则 cv2.imshow() 不会渲染?

    如果没有 cv2 waitkey 方法 cv2 imshow 将显示黑色窗口 为什么不等待就无法正常渲染 cap cv2 VideoCapture video path while cap isOpened ret frame cap re
  • 如何在 Swing 应用程序中隐藏光标?

    有没有办法隐藏光标 除了使用透明图像作为光标之外 当用户将鼠标指向 JFrame 中的 JPanel 之外时 我想隐藏光标 看来Cursor类一开始就没有 空白 光标 因此可以使用以下命令定义一个新的 空白 光标Toolkit create
  • 在SQS队列中使用许多消费者

    我知道可以使用多个线程来使用 SQS 队列 我想保证每条消息都会被消耗一次 我知道可以更改消息的可见性超时 例如等于我的处理时间 如果我的进程花费的时间超过可见性超时 例如连接速度慢 其他线程可以使用相同的消息 保证消息被处理一次的最佳方法
  • 检查字符串是否为回文

    A 回文是一个单词 短语 数字或其他单位序列 可以在任一方向以相同的方式阅读 为了检查一个单词是否是回文 我获取该单词的字符数组并比较字符 我测试了它 它似乎有效 但我想知道这是否正确或者是否有需要改进的地方 这是我的代码 public c
  • Laravel 简单月份选择

    y 尝试从日期字段 fechas 日期时间类型 检索月份 其中使用 SQL 子句 MONTH 进行测试不起作用 感谢您的回复 data DB table ordenes gt select array DB raw cant ped pre
  • 用于按月计算计数的 SQL 查询

    将一列中的 1 12 连接到一组按月计数的好方法是什么 在 SQL 中 SELECT months count whatever1 count1 count whatever2 count2 FROM months LEFT JOIN wh
  • MVC 站点具有特定要求的细化权限

    我不喜欢内置的会员提供商 我决定自己动手 我正在尝试想出一种在操作级别执行授权的好方法 这是我的要求trying前往 属性使用 我喜欢这个 因为它在调用堆栈中控制在非常高的级别 并且是组织权限的好地方 没有魔法字符串 这就是我远离当前角色提
  • Prolog 中的 Switch 语句

    在 Prolog 谓词中 我经常编写像这样的重复条件语句 但我希望它们可以写得更简洁 output Lang Type Output Lang javascript gt Output function Type Lang ruby gt
  • 适用于平板电脑的 Android 应用程序仍显示“专为手机设计”

    我发布了一个应用程序 http bit ly 1GfKsNG 仅适用于平板电脑 AndroidManifest xml调整方式为
  • 如何重写 Haskell 中一些基本类型的 Show 实例?

    我正在用 Haskell 编写一些程序 处理许多基本类型 如 Word32 Word64 等 我经常使用ghci来测试功能 在终端中查看结果 为了方便快捷 我总是以十六进制显示数据 例如 data Human M Int F Int ins
  • 运行时错误 3021-没有当前记录

    我想将查询结果链接到文本框 但出现此错误 这是我的代码 Dim rst As DAO Recordset Set rst CurrentDb OpenRecordset SELECT XValue YValue Wert FROM tb D
  • Android - 如何处理两根手指触摸

    文档对此是这样说的 手势以 ACTION DOWN 的运动事件开始 该事件提供 第一个向下指针的位置 作为每个附加指针 下降或上升 框架将生成一个运动事件 相应地 ACTION POINTER DOWN 或 ACTION POINTER U
  • 如何以编程方式从 plist 添加和检索数据

    大家好 我是 Objective C 的新手 我想动态 以编程方式将数据插入到 plist 中 请帮助我 这是我的 plist 结构 root Client1 report1 application1 application2 report
  • Scala集合,单键多值

    我有一个父键列表 每个父键可能有零个或多个关联值 我不确定使用哪个集合 我在用Map Int List String 我将地图声明为 var nodes new HashMap Int List String 然后我有两种方法来处理添加新元