将键转换为值映射

b

可以说我有一组这样的类Actionactions: Set[Action],每个Action类都有一个val consequences : Set[Consequence],其中Consequence是一个case类。

我希望获得一张地图ConsequenceSet[Action]以确定导致特定行为的动作Consequence显然,由于一个Action可以有多个,Consequence它可以出现在地图的多个集合中。

我一直在努力解决这个问题(我是Scala的新手),想知道是否可以使用诸如map()和groupBy()之类的方法来做到这一点,但是有点失落。我不希望恢复命令式编程,尤其是当有一些Scala映射功能可以提供帮助时。

实现此目标的最佳方法是什么?

0__

不太优雅,因为groupBy无法处理已经在上进行操作的情况Tuple2,因此您最终需要进行许多麻烦和麻烦:

case class Conseq()
case class Action(conseqs: Set[Conseq])

def gimme(actions: Seq[Action]): Map[Conseq, Set[Action]] = 
  actions.flatMap(a => a.conseqs.map(_ -> a))
    .groupBy(_._1)
    .mapValues(_.map(_._2)(collection.breakOut))

第一行将每个动作及其所有结果“压缩”在一起,产生a Seq[(Conseq, Action)]并将其与第一个product元素给定在一起分组Map[Conseq, Seq[(Conseq, Action)]因此,最后一步需要将地图的值从Seq[(Conseq, Action)]转换为Set[Action]可以使用来完成mapValues如果没有显式的生成器工厂,它将产生a Seq[Action],因此必须写.mapValues(_.map(_._2)).toSet传入collection.breakOut第二个参数列表map可以节省一个步骤并map直接生成Set集合类型。


另一种可能性是使用嵌套折叠:

def gimme2(actions: Seq[Action]) = (Map.empty[Conseq, Set[Action]] /: actions) {
  (m, a) => (m /: a.conseqs) {
    (m1, c) => m1.updated(c, m1.getOrElse(c, Set.empty) + a)
  }
}

这也许更具可读性。我们从一个空的结果图开始,遍历这些动作,然后在内部折叠中遍历每个动作的结果,这些结果被合并到结果图中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将映射转换为键=值对

来自分类Dev

scala将字符串列表转换为键/值映射

来自分类Dev

scala将字符串列表转换为键/值映射

来自分类Dev

从字典将值转换为键

来自分类Dev

将键=值对转换为JSON

来自分类Dev

将数组值转换为键

来自分类Dev

从字典将值转换为键

来自分类Dev

Javascript 将值转换为键

来自分类Dev

将多键列表转换为多维排序的映射

来自分类Dev

将 List<String> 转换为 Map<String, List<String>> 列表值作为映射键和映射值与空列表 java 8

来自分类Dev

将多个值列转换为新的键,值对

来自分类Dev

将列表值转换为字典作为键和值

来自分类Dev

将多个值列转换为新的键,值对

来自分类Dev

将数组转换为哈希的键,值的顺序颠倒

来自分类Dev

Perl:将键和值的数组转换为哈希

来自分类Dev

PyYAML自动将某些键转换为布尔值

来自分类Dev

将逗号分隔的键=值对转换为Java对象

来自分类Dev

Python:将元组列表转换为JSON值键对

来自分类Dev

如何将键,值表转换为列表lua

来自分类Dev

Typescript或JavaScript将嵌套的对象数组转换为键,值对

来自分类Dev

BigQuery:将Array中的键/值对转换为列

来自分类Dev

使用值作为键将数据框转换为字典

来自分类Dev

将键,值JSON数组转换为表格JSON格式

来自分类Dev

将字典键和值转换为单独的列表?

来自分类Dev

JS使用属性键/值将数组转换为对象

来自分类Dev

将字符串转换为JSON或获取键的值

来自分类Dev

Perl:将键和值的数组转换为哈希

来自分类Dev

Javascript:将CSV转换为键和值的单独数组

来自分类Dev

将数组值转换为键,而无需迭代