所以我正在尝试使用Scala重新创建 this代码。这就是我到目前为止所做的:
/*
This is a program for the #259 [Easy] Clarence the Slow Typist /r/dailyprogrammer challenge
The algorithm was created by /u/derision.
*/
object Clarence {
def main(args: Array[String]) {
val ip = args(0)
println(ip.tail.zip(ip).map(_.map(x => "123456789.0".indexOf(x))))
}
}
这应该产生一个2d数组,但是当我运行它时,我得到以下错误:
scala Clarence.scala 219.45.143.143
/home/mattjone/sw/coding/learning-scala/Clarence.scala:8: error: value productElements is not a member of (Char, Char)
println(ip.tail.zip(ip).map(_.map(x => "123456789.0".indexOf(x))))
^
one error found
据我所知,它说你不能在一个字符数组上使用.map,但这没有意义。我该怎么做?
答案 0 :(得分:1)
它说map
不是(Char, Char)
的成员,它是元组,而不是数组。
如果您将ip.tail.zip(ip)
提取到var
,则可以看到它的类型为Seq[(Char, Char)]
:
val zip: IndexedSeq[(Char, Char)] = ip.tail.zip(ip)
您可以通过将每个元组转换为序列(大小为2)来解决此问题,例如使用productIterator
(但还有其他方法):
println(ip.tail.zip(ip).map(_.productIterator.toList.map(x => "123456789.0".indexOf(x))))
这将导致打印2D“数组”(实际上是Vector
的{{1}} s。
也许一个更易读的版本会打印一个元组列表,并为了清晰起见命名元组的每个部分:
List
答案 1 :(得分:0)
Tzach Zohar回答了你map
无效的原因。
我的代码可能与该问题无关,但如果您想在Scala中创建2D Char列表,那么这个解决方案呢?
val x = "123456789.0".toList.sliding(2).map(_.reverse).toList
此代码将从“12345 ...”转换为List(List(2,1),List(3,2),List(4,3)......)(List[List[Char]]
)
但是如果您希望列表成员为Tuple2
,则可以使用此代码:
val x = "123456789.0".toList.sliding(2).map(x => (x.last, x.head)).toList
它将生成List((2,1),(3,2),(4,3),...)(List[(Char, Char)]
)。
然后你可以稍后打印它:)