为什么在Scala中使用Tuple over Set?

时间:2016-03-30 20:36:10

标签: scala set tuples difference

两者都可以存储混合类型,但是Set似乎更强大,因为它具有union,intersection或diff等。

另一个重要的区别是元组不被认为是集合。

我正在学习Scala,我想知道为什么我要使用元组而不是集合。

5 个答案:

答案 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)

设定:

  • 必须都是同一类型。
  • 不能包含重复元素。
  • 不保留广告订单。
  • 可以非常大,尺寸不同。
  • 进行更多类似集合的操作。

元组:

  • 可以包含不同类型。
  • 可以在编译时验证。
  • 只能包含22个元素。
  • 旨在保留静态大小的临时结果。

答案 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集合的图形。

enter image description here

答案 4 :(得分:1)

集合和元组之间的一个巨大差异是,集合被视为集合,就像我们从Set Theory中取出集合一样。  如果另一个集合是另一个集合的子集/超集,则Set可以用于有效交叉,联合,差异以及查看。集合中的重复元素没有意义,因为可能总是存在元素的表示。

TupleN只代表N个元素的容器,并且不具备此类Set所拥有的任何属性。因此,当您想要在&#34; bag&#34;中保存多个项目时,您想要使用它,而当您想要将多个项目作为一个组查看并对其进行操作时,将使用一个集合