无法使用 println 在 Scala 中显示结果
can not show result in scala using println
我正在开发一个 scala 脚本,它给出了数组元素的所有不同组合。
例如,假设我们有 Array(1,3,6,7)
。所以,所需的结果应该是这样的:Array((1,3),(1,6),(1,7),(3,6),(3,7),(6,7))
val test : Array[Int] = Array(1,3,6,7)
val result = test.distinct.combinations(2).flatMap{ case Array(a,b) =>
Array((a,b))
}
println(result)
但是这段代码没有打印出需要的结果。
编辑
为了增加需要,初始 table 应该是字符串而不是整数(这只是为了操作测试)。
Asuume 我有列表 val test = List("test", "tabdc", "efjh", "hlmn")
根据 @Luis Miguel Mejía Suárez 的提议,我生成了所有组合
val result: List[(String, String)] = List((test,tabdc), (test,efjh), (test,hlmn), (tabdc,efjh), (tabdc,hlmn), (efjh,hlmn))
使用
val result = test.distinct.combinations(2).collect {
case a :: b :: Nil =>
(a, b)}.toList
现在,我应该比较这些代码生成的每一对,以根据这些规则构造一个字符串:
- 当第一部分的最后一个字符为
等于第二部分的第一个字符。
- 合并两个部分时,只有一个链接字符的副本是
保留
换句话说:
- 对于夫妇
(test,tabdc)
:我们有 test
结束于 t
并且
tabdc
以 t
开头。因此,它们应该添加为“testabdc
”
- 对于夫妇
((efjh,hlmn))
:我们有 efjh
结束于 h
和
hlmn
以 h
开头。因此,它们应该添加为:“efjhlmn
”
在此示例中:最终结果应为 testabdctestabdc
(所有连接部分之间的连接)
请问我该怎么做?
result
是 Iterator
即 lazy,因此一种打印方法是使用 toSeq
实现它,例如:
println(result.toSeq) // prints List((1,3), (1,6), (1,7), (3,6), (3,7), (6,7))
好的,这段代码中发生了很多事情。
combinations
returns 一个 Iterator
本质上是懒惰的,所以这就是你看不到任何输出的原因;因为它根本没有计算任何东西。
您可以尝试通过在末尾添加 toArray
来解决该问题,但这会给您带来错误的输出。
Arrays
不应使用,尤其是在学习时,它们对 Java 互操作和性能调整很有用,但是正常的 Scala 代码不应该对这些事情感到好奇。
不使用 Arrays
的原因列表包括:它们是可变的,它们是不变的,它们不是集合层次结构的一部分,它们的 equals
是引用而不是值,它们的 toString
没有很好地打印 Array
的内容;这就是为什么在末尾添加 toArray
不会解决问题。因此,我们应该在任何地方都使用 List
。
没必要 flatMap
一个简单的 map
就可以了。但是,由于 combinations
不能保证其输出的类型安全,最好使用 collect
以确保安全。
因此最终代码为:
val test = List(1, 3, 6, 7)
val result = test.distinct.combinations(2).collect {
case a :: b :: Nil =>
(a, b)
}.toList
可以看到代码运行 here.
我正在开发一个 scala 脚本,它给出了数组元素的所有不同组合。
例如,假设我们有 Array(1,3,6,7)
。所以,所需的结果应该是这样的:Array((1,3),(1,6),(1,7),(3,6),(3,7),(6,7))
val test : Array[Int] = Array(1,3,6,7)
val result = test.distinct.combinations(2).flatMap{ case Array(a,b) =>
Array((a,b))
}
println(result)
但是这段代码没有打印出需要的结果。
编辑
为了增加需要,初始 table 应该是字符串而不是整数(这只是为了操作测试)。 Asuume 我有列表 val test = List("test", "tabdc", "efjh", "hlmn") 根据 @Luis Miguel Mejía Suárez 的提议,我生成了所有组合
val result: List[(String, String)] = List((test,tabdc), (test,efjh), (test,hlmn), (tabdc,efjh), (tabdc,hlmn), (efjh,hlmn))
使用
val result = test.distinct.combinations(2).collect {
case a :: b :: Nil =>
(a, b)}.toList
现在,我应该比较这些代码生成的每一对,以根据这些规则构造一个字符串:
- 当第一部分的最后一个字符为 等于第二部分的第一个字符。
- 合并两个部分时,只有一个链接字符的副本是 保留
换句话说:
- 对于夫妇
(test,tabdc)
:我们有test
结束于t
并且tabdc
以t
开头。因此,它们应该添加为“testabdc
” - 对于夫妇
((efjh,hlmn))
:我们有efjh
结束于h
和hlmn
以h
开头。因此,它们应该添加为:“efjhlmn
”
在此示例中:最终结果应为 testabdctestabdc
(所有连接部分之间的连接)
请问我该怎么做?
result
是 Iterator
即 lazy,因此一种打印方法是使用 toSeq
实现它,例如:
println(result.toSeq) // prints List((1,3), (1,6), (1,7), (3,6), (3,7), (6,7))
好的,这段代码中发生了很多事情。
combinations
returns 一个Iterator
本质上是懒惰的,所以这就是你看不到任何输出的原因;因为它根本没有计算任何东西。
您可以尝试通过在末尾添加toArray
来解决该问题,但这会给您带来错误的输出。Arrays
不应使用,尤其是在学习时,它们对 Java 互操作和性能调整很有用,但是正常的 Scala 代码不应该对这些事情感到好奇。
不使用Arrays
的原因列表包括:它们是可变的,它们是不变的,它们不是集合层次结构的一部分,它们的equals
是引用而不是值,它们的toString
没有很好地打印Array
的内容;这就是为什么在末尾添加toArray
不会解决问题。因此,我们应该在任何地方都使用List
。没必要
flatMap
一个简单的map
就可以了。但是,由于combinations
不能保证其输出的类型安全,最好使用collect
以确保安全。
因此最终代码为:
val test = List(1, 3, 6, 7)
val result = test.distinct.combinations(2).collect {
case a :: b :: Nil =>
(a, b)
}.toList
可以看到代码运行 here.