代码之家  ›  专栏  ›  技术社区  ›  Frank

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

  •  0
  • Frank  · 技术社区  · 7 年前

    这里有两个哈希集:

    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] .

    我该怎么做?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Shaido Aman    7 年前

    不建议在同一个系统中使用不同的类型 Map 但是,您可以使用 Some asInstanceOf 这样地:

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

    请注意,任务 val v = ... 是在 match 允许事后使用变量。这个 火柴 因为边缘是相似的。


    然而 更好的解决方案 将为图形使用case类。这样你就可以避免很多麻烦。

    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]