为什么在Scala中要使用元组(Tuple)而不是集合(Set)?

5

两者都可以存储混合类型,但是Set似乎更强大,因为它具有并集、交集或差集等功能。

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

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


3
集合(Set)会去除重复项,而元组(Tuples)可以包含重复项。 - rogue-one
那是一个很好的观点。 - Alejandro García Seco
5个回答

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],但编译器和代码其余部分都确切地知道它正在获取什么。

3

集合:

  • 所有元素必须是相同类型。
  • 不能包含重复元素。
  • 不保留插入顺序。
  • 可以非常大,大小不同。
  • 具有更多类似于集合的操作。

元组:

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

2

当你需要返回两个Ints或一个Int和一个String时,你不会使用像Set这样的东西。想象一下编写一个方法,但是你需要返回两个Ints或一个Int和一个String,而不仅仅是返回一个Int。在那种情况下返回一个Set[Any]并没有实际意义,但是返回一个(Int, Int)或(Int, String)会更加可读和清晰。


4
我同意这个说法。集合和元组之间的交集实际上是零。它们之间的共同点非常少,以至于询问它们之间的区别没有任何意义,就像询问蓝色和攻击直升机之间的区别一样没有意义。 - Jörg W Mittag
1
同意,如果你已经知道答案,根据你的经验来说这样一个愚蠢的问题是毫无意义的,但不幸的是这并不适用于我。 - Alejandro García Seco
没关系,Alejandro,不用道歉 :) - Emil

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个的限制,而集合没有这个限制。

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


1
一个集合和一个元组之间的巨大区别在于,集合被视为一组,就好像我们将其从集合论中取出来一样。一个Set可用于有效地进行交集、并集、差集操作,并查看另一个集合是否是该集合的子集/超集。在一个集合中,重复的元素没有意义,因为可能总会有一个元素的表示。
一个TupleN简单地表示N个元素的容器,不具备Set所具有的任何属性。因此,当你想要在一个“袋子”中保存多个项目时,你会想要使用它,而当你想要将多个项目视为一组并相应地对它们进行操作时,你会使用一个集合。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接