在Scala中创建三个整数的元组

时间:2014-03-03 21:31:24

标签: scala tuples

我有一个问题,我需要制作三个元素的连音符。假设我有一个列表,我设法写了两个元素的连音符:

val list = (1 to 10).toList

val map1 = list.foldLeft(Map.empty[Int,String])( (map, value) => map + (value -> value.toString) )

Map(5 -> 5, 10 -> 10, 1 -> 1, 6 -> 6, 9 -> 9, 2 -> 2, 7 -> 7, 3 -> 3, 8 -> 8, 4 -> 4)

我想制作一个包含三个元素的连音符。我怎么能这样做?

我试过这段代码:

val map1 = list.foldLeft(Map.empty[Int,String])( (map, value, s) => map + (value -> value.toString -> value.toString) )

Map(5 -> 5 -> 5, 10 -> 10-> 10, 1 -> 1-> 1, 6 -> 6-> 6, 9 -> 9-> 9, 2 -> 2-> 2, 7 -> 7-> 7, 3 -> 3-> 3, 8 -> 8-> 8, 4 -> 4-> 4)

2 个答案:

答案 0 :(得分:3)

->只是一对糖的符号(两个元组的元组)。任何arity元组的通用符号都是以括号括起来的逗号分隔列表。例如。 (1,2,3)是三个整数的元组,而在您的示例中,表达式1 -> 2 -> 3将desugar到((1,2),3),这是一个由两个整数和一个int组成的元组的元组。

您尝试使用代码实现的目标根本没有任何意义。可以从对列表构造Map,将元组的第一个元素视为键,将第二个元素视为值。任何其他arities的元组都不受支持,在这种情况下没有意义。但是,您可以构建包含任何arities元组的其他类型的集合(例如,List)。

答案 1 :(得分:1)

通常,要将范围转换为Tuple3,您可以执行以下操作:

(0 to 10) map (x=>(x,x*2,x+10))
res0: scala.collection.immutable.IndexedSeq[(Int, Int, Int)] = Vector((0,0,10), (1,2,11), (2,4,12), (3,6,13), (4,8,14), (5,10,15), (6,12,16), (7,14,17), (8,16,18), (9,18,19), (10,20,20))

要将2个Seqs作为Tuple2加入,请将其压缩:

 (1 to 5) zip (10 to 15)
res3: scala.collection.immutable.IndexedSeq[(Int, Int)] = Vector((1,10), (2,11), (3,12), (4,13), (5,14))

scala已经支持拉伸到arity 3:

((0 to 3),(4 to 6),(7 to 9)).zipped.toList
res6: List[(Int, Int, Int)] = List((0,4,7), (1,5,8), (2,6,9))

如果你需要做更高级的事情,那就是product-collections

(0 to 3) flatZip (4 to 6) flatZip (7 to 9) flatZip (10 to 12)
res7: org.catch22.collections.immutable.CollSeq4[Int,Int,Int,Int] = 
CollSeq((0,4,7,10),
        (1,5,8,11),
        (2,6,9,12))

最后有shapeless可以做很多很酷的事情,但学习曲线适中。