两者都可以存储混合类型,但是Set似乎更强大,因为它具有并集、交集或差集等功能。
另一个重要的区别是元组不被视为集合。
我正在学习Scala,想知道为什么我要使用元组而不是集合。
两者都可以存储混合类型,但是Set似乎更强大,因为它具有并集、交集或差集等功能。
另一个重要的区别是元组不被视为集合。
我正在学习Scala,想知道为什么我要使用元组而不是集合。
元组的主要优点是维护了类型信息。在像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
],但编译器和代码其余部分都确切地知道它正在获取什么。集合:
元组:
当你需要返回两个Ints或一个Int和一个String时,你不会使用像Set这样的东西。想象一下编写一个方法,但是你需要返回两个Ints或一个Int和一个String,而不仅仅是返回一个Int。在那种情况下返回一个Set[Any]并没有实际意义,但是返回一个(Int, Int)或(Int, String)会更加可读和清晰。
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集合的图形。
Set
可用于有效地进行交集、并集、差集操作,并查看另一个集合是否是该集合的子集/超集。在一个集合中,重复的元素没有意义,因为可能总会有一个元素的表示。TupleN
简单地表示N个元素的容器,不具备Set
所具有的任何属性。因此,当你想要在一个“袋子”中保存多个项目时,你会想要使用它,而当你想要将多个项目视为一组并相应地对它们进行操作时,你会使用一个集合。