在Scala中映射2d Char列表

时间:2016-03-24 19:32:45

标签: scala

所以我正在尝试使用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,但这没有意义。我该怎么做?

2 个答案:

答案 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)])。 然后你可以稍后打印它:)