如何从Map中获取不同类型的元素

时间:2017-11-14 05:58:48

标签: scala scala-collections

这里我有两个哈希集:

var vertexes = new HashSet[String]()
var edges = new HashSet[RDFTriple]() //RDFTriple is a class

我想将它们放入这样的地图中:

var graph = Map[String, HashSet[_]]()
graph.put("e", edges)
graph.put("v", vertexes)

但是现在我想分别获取顶点和边缘但是失败了。我尝试过以下内容:

val a = graph.get("v")
a match {    
  case _ => val v = a 
}
val b = graph.get("e")
b match {
  case _ => val e = b
}

ve被识别为Option[HashSet[_]],而我想要的是HashSet[String]HashSet[RDFTriple]

我该怎么做?

我会非常感激,因为它太困扰了我。

1 个答案:

答案 0 :(得分:1)

建议不要在同一个Map中使用不同的类型,但是使用SomeasInstanceOf就可以解决这个问题:

val v = a match {    
  case Some(a) => a.asInstanceOf[HashSet[String]]
  case None    => // do something
}

请注意,分配val v = ...是在match之外完成的,以允许在之后使用变量。边缘的match类似。

然而,更好的解决方案将使用图表的案例类。那你就可以避免很多麻烦。

case class Graph(vertexes: HashSet[String], edges: HashSet[RDFTriple])

val graph = Graph(vertexes, edges)
val v = graph.vertexes // HashSet[String]
val e = graph.edges    // HashSet[RDFTriple]