2016-08-30 4 views
2

Sorry für Neuling Frage. Ich versuche Pythons issuperset() mit Scala KlasseWie zu implementieren Pythons issuperset() in Scala

Python Beispiel zu implementieren:

weighted_fruits_set = {"banana", "orange","apple"} 
check = {"banana"} 
weighted_fruits_set.issuperset(check) 

Python Antworten: "True"

mein Scala Code unten, habe ich versucht containssuperset aus der Liste der case class weightedFruits zu finden und ich überprüfen, ob Zeichenkette "banana" existiert in weightedFruits.name:

object Learn extends App { 


    case class weightedFruits(name:List[String], weight:Double) { 
override def toString = s"name: ${name.mkString("<", ",", ">")}, weight: $weight\n" 
} 

var weightedFruitsList = new scala.collection.mutable.ListBuffer[weightedFruits]() 

weightedFruitsList += ( 
        weightedFruits(List("banana","orange"),180), 
        weightedFruits(List("banana","orange","apple"),170),         
        weightedFruits(List("feijoa","fig"),201), 
        weightedFruits(List("banana","apple","melon"),165) 
        ) 

val check = weightedFruits(List("banana"),200)      

weightedFruitsList += check      

val item = weightedFruitsList(1) 

val bol:Boolean = item.name.contains(check.name) 

println("item: "+item) 
println("check: "+check) 
println("bool: "+bol) 

} 

Der Ausgang meines Codes ist false (aber muss true sein):

item: name: <banana,orange,apple>, weight: 170.0 

check: name: <banana>, weight: 200.0 

bool: false 

Vielen Dank für jede Hilfe. Ich hoffe wirklich, meine Erklärung

+0

Wie ich Ihre Fragen verstehe, bedeutet 'iuplperset': ' def f [A] (Liste1: Liste [A], list2: Liste [A]): ​​Boolean 'wo' true' bedeutet, dass ' list1 'enthält alle' list2' Elemente und 'false' sonst? Also 'f (Liste (1,2,3), Liste (1)) === wahr', aber 'f (Liste (1,2,3), Liste (4)) === false'? –

+1

'.contains' nimmt ein Element, keine Liste, in Ihrem Fall' List ("banana", "orange"). Enthält (List ("banana")) == false' –

Antwort

2
def isSuperSet[A](a: Set[A])(b: List[A]) = b.forall(a.contains(_)) 

oben Funktion gibt true klar war, ob a Obermenge von b

convert Liste der Früchte zu Set ist (a), und dann diese Funktion verwenden.

+0

Sie brauchen nicht 'b' ein 'Set' zu sein, und selbst für' a' ist es nur wichtig, wenn Sie lange Listen haben. Die letzte Anweisung ist falsch, notieren Sie '.name' in OP. –

+0

@VictorMoroz danke für die suggection. bearbeitet die Antwort. – pamu

+0

@VictorMoroz gute Beobachtung – pamu

4

Die anderen aktuellen Antworten machen meiner Meinung nach mehr, als sie brauchen. Wenn Menge A eine Teilmenge von Menge B ist, dann sind alle Elemente von A in B. Wenn wir also alle Elemente von B aus A entfernen, sollte nichts mehr übrig sein. So

val a = List("banana") 
val b = List("banana", "orange","apple") 
val c = List("tomato") 

(a diff b).isEmpty        //> true 
(c diff b).isEmpty        //> false 

(Sie geben nicht, was passieren soll, wenn entweder „Set“ enthält Duplikate)

Und wenn Sie tatsächlich Sets und nicht die Listen verwenden, dieser Vorgang ist bereits in der Standardbibliothek

def subsetOf(that: GenSet[A]): Boolean 

Prüft, ob dieser Satz eine Teilmenge einer anderen Menge ist. dass der Satz auf testen. true zurück, wenn dieser Satz eine Teilmenge davon ist, das heißt, wenn jedes Element dieses Satzes ist auch ein Element der

Siehe Scaladoc here

mit .toSet So können Sie Ihre „Sets“ zu tatsächlichen Sets umwandeln , und verwenden Sie diese

+0

Das einzige Problem mit diesem Ansatz ist, dass Sie eine Zwischenliste erstellen (hoffentlich leer), während in der Tat Sie nur einen boolean benötigen (und hinter der Szene ist 'HashMap', aber dieser Teil ist wahrscheinlich unvermeidbar. Außerdem scannt es die gesamte linke Liste, selbst wenn das Ergebnis bereits definiert ist. –

+0

Sicher, Sie können es schneller machen. Aber es ist kurz, klar und einfach zu demonstrieren funktioniert richtig. Sobald der Code richtig funktioniert und die Messungen zeigen, dass dies ein bedeutender Zeitverbraucher ist, kann er optimiert werden. Außerdem hat die Zwischenliste höchstens die Länge der Teilmenge. –

+0

Dank @The Archetypal Paul für detaillierte Erklärung und Erwähnung 'Set' – Toren

Verwandte Themen