2016-03-30 15 views
4

Beide können gemischte Typen speichern, aber ein Set scheint viel mächtiger zu sein, da es unter anderem Union, Intersection oder Diff bietet.Warum Tuple über Set in Scala verwenden?

Ein weiterer wichtiger Unterschied ist, dass Tupel nicht als Sammlungen betrachtet werden.

Ich lerne Scala und ich frage mich, warum ich Tupel über Sets verwenden möchte.

+3

Set entfernt Duplikate, während Tupel Duplikate haben können –

+0

Das ist ein guter Punkt. –

Antwort

7

Der Hauptvorteil von Tupeln ist, dass Typinformationen beibehalten werden. Dies ist eine große Sache in einer statisch typisierten Sprache wie Scala.

scala> (4.2,'c',true,"blah",7) 
res2: (Double, Char, Boolean, String, Int) = (4.2,c,true,blah,7) 

scala> Set(4.2,'c',true,"blah",7) 
<console>:11: warning: a type was inferred to be `Any`; this may indicate a programming error. 
     Set(4.2,'c',true,"blah",7) 
     ^
res3: scala.collection.immutable.Set[Any] = Set(true, blah, 7, c, 4.2) 

Sobald unsere Set Typ ist Set[Any] dann haben wir Typinformationen verloren, die bei der Vermeidung von Problemen nützlich sein könnte (das heißt Bugs) auf der ganzen Linie.

Auch ziehen Elemente aus einem Set[Any] kann ein Schmerz sein. Jedes Element, das daraus extrahiert wird [z.B. mySet.head] muss wahrscheinlich vor der Verwendung auf den Typ getestet werden. Einzelne Elemente aus einem Tupel zu erhalten, kann auch ziemlich umständlich sein [myTup._3], aber der Compiler und der Rest Ihres Codes wissen genau, was er bekommt.

2

Sie würden nicht so etwas wie ein Set verwenden, wenn Sie ein Tupel benötigen. Stellen Sie sich vor, Sie schreiben eine Methode, aber anstatt beispielsweise nur einen Int zurückzugeben, müssen Sie zwei Ints oder einen Int und einen String zurückgeben. Einen Satz [Beliebig] zurückzugeben macht hier keinen Sinn, aber die Rückgabe eines (Int, Int) oder (Int, String) ist deutlich lesbarer und klarer in Bezug auf die Absicht.

+4

Ich stimme zu. Es gibt buchstäblich keine Überlappung zwischen Mengen und Tupeln. Sie haben so wenig miteinander gemein, dass es nicht einmal Sinn macht, nach Unterschieden zwischen ihnen zu fragen, genauso wie es keinen Sinn macht, nach dem Unterschied zwischen der Farbe Blau und einem Angriffshubschrauber zu fragen. –

+1

Einverstanden, es macht keinen Sinn, so eine dumme Frage zu stellen, wenn Sie die Antwort vorhand nach Ihrer Erfahrung kennen, nicht mein Fall tut mir leid. –

+0

Keine Sorge, Alejandro, und keine Notwendigkeit, sich zu entschuldigen :) – Emil

1

Ein Set ist eine iterierbare Sammlung, die entweder veränderbar oder unveränderlich sein kann und nur bestimmte Werte annehmen kann.

val set = Set('a','b','b') 
println(set) 
set.foreach(i => print(i + ", ")) 

Wird

Set(a,b) 
a, b, 

Ein Tuple ist unveränderlich, drucken und es ist nicht eine Sammlung, und es wird keine Elemente auf unterschiedliche Werte reduzieren und es unterhält die Typen der Elemente. Es kann iterierbar sein, wenn Sie die Methode productIterator() auf das Tupel anwenden.

val tuple = ('a','b','b') 
println(tuple) 
tuple.productIterator.foreach(i => println(i)) 

Wird

(a,b,b) 
a, b, b, 

Ein Tupel Druck von 22 Elemente beschränkt, in denen ein Set diese Grenze nicht haben.

val set = Set('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z') 
println("set: " + set) 

Wird set: Set(e, s, x, n, j, y, t, u, f, a, m, i, v, q, b, g, l, p, c, h, r, w, k, o, z, d)

Ein Set ist wohl robuster drucken, während ein Tupel eine gewisse Flexibilität Oberfläche Ebene sieht vor, dass ein Set (und anderen Sammlungen) bieten nicht. Hier sehen Sie eine Grafik einiger anderer Scala-Sammlungen als Set.

enter image description here

1

Ein großer Unterschied zwischen einem Satz und einem Tupel ist, dass ein Satz als eine Sammlung betrachtet wird, als ob wir es Set Theory aus nahmen. Ein Set kann für effizientes Überschneiden, Vereinigungen, Diffing und auch zum Anzeigen verwendet werden, wenn eine andere Menge eine Untermenge/Obermenge der anderen Menge ist. Es gibt keine Bedeutung für doppelte Elemente in einer Menge, da immer eine Repräsentation eines Elements vorhanden sein kann.

Ein TupleN stellt einfach einen Container mit N Elementen dar und besitzt keine der Eigenschaften, die ein solcher Set enthält. Daher möchten Sie es verwenden, wenn Sie mehrere Elemente in einem "Beutel" halten möchten, während ein Satz verwendet wird, wenn Sie mehrere Elemente als eine Gruppe anzeigen und entsprechend bearbeiten möchten.

2

Sets:

  • alle müssen vom gleichen Typ sein.
  • Kann keine doppelten Elemente enthalten.
  • Speichern Sie die Reihenfolge nicht ein.
  • Kann sehr groß sein, mit unterschiedlicher Größe.
  • Haben Sie mehr Sammlung ähnliche Operationen.

Tupeln:

  • Können verschiedene Arten enthalten.
  • Kann zur Kompilierzeit verifiziert werden.
  • Kann nur 22 Elemente enthalten.
  • sollen temporäre Ergebnisse mit einer statischen Größe halten.