如何从 Map 中获取不同类型的元素
How to take different types of elements from Map
这里我得到了两个哈希集:
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
}
但是 v
和 e
被识别为 Option[HashSet[_]]
而我想要的是 HashSet[String]
和 HashSet[RDFTriple]
.
我该怎么做?
我会非常感激它,因为它困扰我太久了。
不建议在同一个 Map
中使用不同的类型,但是您可以像这样使用 Some
和 asInstanceOf
来解决问题:
val v = a match {
case Some(a) => a.asInstanceOf[HashSet[String]]
case None => // do something
}
请注意,赋值 val v = ...
是在 match
之外完成的,以允许之后使用该变量。边缘的 match
类似。
但是,更好的解决方案 是为图表使用案例 class。这样就省去了很多麻烦。
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]
这里我得到了两个哈希集:
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
}
但是 v
和 e
被识别为 Option[HashSet[_]]
而我想要的是 HashSet[String]
和 HashSet[RDFTriple]
.
我该怎么做?
我会非常感激它,因为它困扰我太久了。
不建议在同一个 Map
中使用不同的类型,但是您可以像这样使用 Some
和 asInstanceOf
来解决问题:
val v = a match {
case Some(a) => a.asInstanceOf[HashSet[String]]
case None => // do something
}
请注意,赋值 val v = ...
是在 match
之外完成的,以允许之后使用该变量。边缘的 match
类似。
但是,更好的解决方案 是为图表使用案例 class。这样就省去了很多麻烦。
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]