Scala增强集合

Scala增强集合,scala,collections,Scala,Collections,我感兴趣的是Scala是否提供了使用异构集合的便捷方式 特别是变量类型和多键多映射 我知道第一个可以构建在嵌套的任择类任择[A,B],C]之上,第二个可以构建在嵌套的映射类Map[A,Map[B,Set[C]]之上,但是每次需要它们时直接执行更新/删除操作似乎太复杂了(我经常需要它们) 因此,我正在寻找一个现成的解决方案。或者在标准库中有一种方便而简单的方法?无论如何,如果您可以建议第三方框架,也可以。要创建“变体类型”,您可以使用继承。为了“保证”只存在N个变体(不管怎样,从Scala代码来看

我感兴趣的是Scala是否提供了使用异构集合的便捷方式

特别是变量类型和多键多映射

我知道第一个可以构建在嵌套的任择类
任择[A,B],C]
之上,第二个可以构建在嵌套的映射类
Map[A,Map[B,Set[C]]
之上,但是每次需要它们时直接执行更新/删除操作似乎太复杂了(我经常需要它们)

因此,我正在寻找一个现成的解决方案。或者在标准库中有一种方便而简单的方法?无论如何,如果您可以建议第三方框架,也可以。

要创建“变体类型”,您可以使用继承。为了“保证”只存在N个变体(不管怎样,从Scala代码来看,Java代码不会被阻止创建更多的子类),您可以使用一个
sealed trait
。如果您需要使用一个已经存在且无法修改(和/或移动)的类型来扩展您的trait,您可以将其包装在一个带有单个字段的
案例类中

我认为您应该能够使用值类(如果
MyTrait
是一种通用特性,则使用
extensedanyval with MyTrait
)来防止这种情况下的运行时开销,但我没有尝试过


对于多键多重贴图,可以使用
Map[(A,B),设置[C]]
。Scala中的元组可以从2个值到22个值。或者,还有一个
多重映射
特性,您可以将其混合到可变映射中。

Scala不提供使异构集合易于管理的工具

与其使用复杂的
嵌套,即选择可能没有意义的特定树结构,不如使用'
HList
s。我不确定你会认为这很容易,但它肯定比
或者
-树更紧凑(一旦你学会了足够的变形魔法)

我熟悉的任何公共库都不支持多键映射。这类映射有很多可能的选择:键是分层的还是冗余的?对称查找是否重要(即,如果您有
A
键,则可以获得映射
B=>C
,如果您有
B
键,则可以获得映射
A=>C
?我只想指出,编写一个包装器并不是那么难,它允许您在任意形式的多键映射上定义自己的方法。您可能必须编写自己的包装器才能获得所需的行为。最简单的方法就是提供2元contains、get和update方法:

implicit class NestedMapAs2Map[A, B, C](val m: Map[A, Map[B, C]]) extends AnyVal {
  def contains2(a: A, b: B): Boolean = m.get(a).exists(_ contains b)
  def get2(a: A, b: B): Option[C] = m.get(a).flatMap(_.get(b))
  def updated2(a: A, b: B, c: C) = m.updated(a, m.get(a).map(mi => mi.updated(b,c)).getOrElse(Map(b -> c)))
}

异构集合通常是代码气味的标志-如果需要在同一集合中保留不同的类型,那么它们可能有一些公共接口-即,这应该通过多态性来实现。地图地图称为表-。我不知道Scala有类似的API。@Boris the Spider,如果您不熟悉这个主题,请不要回答。问题显然是关于Scala,而不是Java。另外,将变体类型(这是许多语言中实现多态性的一种众所周知的方式)视为“代码气味”似乎也很有争议。我没有回答,我评论道。@Boristeider异构集合的良好用途包括基于索引参数化列表元素,基于键参数化映射元素,或泛化方法签名。不过,我同意这可能是一个钝的工具。谢谢你的回答,罗宾!与嵌套映射方法相比,具有元组键的映射是否具有相同的查找性能?我试图输入的数据具有层次性。我想这取决于数据和您选择的
Map
实现。我建议你用两种方法对它进行基准测试。你如何为一个特定的
a
获得
Map[B,Set[C]]
?啊,为此你必须做一些类似
。filter(u.\u 1==a)
整体
Map[(a,B),Set[C]
。这不会特别有效(并且生成的
Map
也不会有正确的类型!)感谢您引用了Shapeless。我来看看。关于多键映射。通常我使用分层键,查找是右关联非对称的。就像我在上面的例子中介绍的那样。这就是为什么我不确定@RobinGreen使用元组的建议的效率。@Eliah-如果你想要某种形式的
A=>B=>C
,拥有一个
(A,B)=>C
的映射既不高效也不方便。所以,不,元组可能不是您想要的,除非您总是手头有两个键。