两者都可以存储混合类型,但是Set似乎更强大,因为它具有union,intersection或diff等。
另一个重要的区别是元组不被认为是集合。
我正在学习Scala,我想知道为什么我要使用元组而不是集合。
答案 0 :(得分:7)
元组的主要优点是保持了类型信息。对于像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)
一旦我们的Set
类型为Set[Any]
,我们就会丢失类型信息,这些信息可能有助于避免问题(即错误)。
此外,从Set[Any]
拉出元素可能会很痛苦。从中提取的每个元素[例如mySet.head
]可能必须先进行类型测试才能使用。从元组中获取单个元素也可能相当麻烦[myTup._3
],但编译器和代码的其余部分确切地知道它正在获得什么。
答案 1 :(得分:3)
设定:
元组:
答案 2 :(得分:2)
当你需要一个元组时,你不会使用类似Set的东西。想象一下编写一个方法,但不是只返回一个Int,例如,你需要返回两个Int,或者一个Int和一个String。返回一个Set [Any]在那里确实没有意义,但返回一个(Int,Int)或(Int,String)在意图方面更具可读性和清晰度。
答案 3 :(得分:1)
Set是可迭代的集合,可以是可变的也可以是不可变的,只能采用不同的值。
val set = Set('a','b','b')
println(set)
set.foreach(i => print(i + ", "))
将打印
Set(a,b)
a, b,
元组是不可变的,它不是集合,它不会将元素减少为不同的值,并且它维护元素的类型。如果将productIterator()方法应用于元组,则可以迭代。
val tuple = ('a','b','b')
println(tuple)
tuple.productIterator.foreach(i => println(i))
将打印
(a,b,b)
a, b, b,
元组由22个元素限制,其中Set没有该限制。
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)
将打印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)
Set可以说更强大,而元组提供了Set(和其他集合)不提供的一些表面级灵活性。这是除Set之外的一些scala集合的图形。
答案 4 :(得分:1)
集合和元组之间的一个巨大差异是,集合被视为集合,就像我们从Set Theory中取出集合一样。
如果另一个集合是另一个集合的子集/超集,则Set
可以用于有效交叉,联合,差异以及查看。集合中的重复元素没有意义,因为可能总是存在元素的表示。
TupleN
只代表N个元素的容器,并且不具备此类Set
所拥有的任何属性。因此,当您想要在&#34; bag&#34;中保存多个项目时,您想要使用它,而当您想要将多个项目作为一个组查看并对其进行操作时,将使用一个集合