2017-11-14 2 views
0

Hier habe ich zwei Hash-Sets:Wie verschiedene Arten von Elementen aus der Karte nehmen

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

Ich möchte wie diese sie in eine Karte setzen:

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

Aber jetzt will ich nehmen Ecken und Kanten jeweils aber nicht bestanden. Ich habe so etwas wie das folgende versucht:

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

Aber v und e als Option[HashSet[_]] anerkannt, während ich sind HashSet[String] und HashSet[RDFTriple] wollen.

Wie kann ich das tun?

Ich werde es so sehr schätzen, weil es mich zu lange stört.

Antwort

1

Es wird nicht empfohlen, verschiedene Arten in der gleichen Map zu verwenden, kann jedoch einige das Problem durch Some und asInstanceOf wie folgt aus:

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

Beachten Sie, dass die Zuordnung val v = ... außerhalb des match getan wird, damit Verwendung der Variablen danach. Die match für die Kanten ist ähnlich.


jedoch eine bessere Lösung eine Fallklasse für die Grafik zu verwenden wäre. Dann würden Sie viel Ärger vermeiden.

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] 
+1

Vielen Dank! Das ist was ich will – Frank

Verwandte Themen