2016-03-24 9 views
1

スカラで thisコードを再作成しようとしています。スカラーの2d Charリストのマッピング

/* 
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)))) 
    } 
} 

これは2次元配列を生成しなければならないが、私はそれを実行したときに、私は次のエラーが出る::私が言うことができるものから、

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を使用していないが、それは意味をなさない。私はこれをどのようにしなければならないのですか?

答えて

1

mapタプル、ない配列で(Char, Char)のメンバーではないことを述べています。 あなたがvarip.tail.zip(ip)を抽出する場合、あなたはそれがタイプだ見ることができますが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 "アレイ"(実際VectorListのS)を印刷することになります。

はおそらく、より読みやすいバージョンはタプルのリストを出力1、および名前明確にするため、タプルの各部分のようになります。

// this will be applied to each part of the tuple: 
def transformChar(c: Char): Int = "123456789.0".indexOf(c) 
// map each tuple to a new transformed tuple: 
println(ip.tail.zip(ip).map { 
    case (prev, cur) => (transformChar(prev), transformChar(cur)) 
}) 
0

Tzachゾハルはmapが働いていない理由について、あなたに答え。

私のコードはこの問題に関連していないかもしれませんが、Scalaで2D Charリストを作成したい場合、このソリューションはどうですか?

val x = "123456789.0".toList.sliding(2).map(_.reverse).toList 

このコードはリストに "... 12345" から変換されます(リスト(2、1)、リスト(3、2)、リスト(4,3)...)(List[List[Char]]

しかし、あなたがリストのメンバーがTuple2になりたい場合は、あなたの代わりにこのコードを使用することができます:

val x = "123456789.0".toList.sliding(2).map(x => (x.last, x.head)).toList 
をし、それがリスト((2,1)、(3,2)、(4,3)を生成します、...)( List[(Char, Char)])。 これで後で印刷することができます:)

関連する問題