Scala

2016-03-24 25 views
1

2d Char listesi eşleme Scala ile this kodunu yeniden oluşturmaya çalışıyorum.Scala

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

Bu 2d dizi üretmelidir, ama onu çalıştırdığınızda aşağıdaki hata olsun: Ne söyleyebilirim Gönderen

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 

o yapabilirsiniz olduğunu söylüyor Bu defa ne var Bir dizi karakter üzerinde .map kullanmayın, ancak bu mantıklı değil. Bunu nasıl yapmalıyım?

cevap

1

O map bir kayıt düzeni değil, bir dizidir (Char, Char) üyesi olmadığını söylüyor. Bir var içine ip.tail.zip(ip) ayıklarsanız , bunu tip Seq[(Char, Char)] olduğunu var görebilirsiniz:

val zip: IndexedSeq[(Char, Char)] = ip.tail.zip(ip) 

Sen productIterator kullanılarak örneğin (boyut 2) ile bir dizi haline her başlığın dönüştürerek bu çözebilir (ancak diğer vardır yolları):

println(ip.tail.zip(ip).map(_.productIterator.toList.map(x => "123456789.0".indexOf(x)))) 

2D "dizi" (aslında bir VectorList ait lar) baskı olmasına neden olur.

Belki bir daha okunabilir versiyonu tüp listeleriniz yazdırır birini ve isimleri netlik için başlığın her parçası olacak:

// 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 Zohar map çalıştı niye hakkında cevap verdi.

Kodlarım bu sorunla ilgili olmayabilir, ancak Scala'da 2D Char listesi oluşturmak istiyorsanız, bu çözüm hakkında ne düşünüyorsunuz?

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

Bu kod Listesine "... 12345" dönüşeceksiniz (Liste (2, 1), Liste (3, 2), listesi (4, 3) ...) (List[List[Char]])

Ama liste üyeleri Tuple2 olmak istiyorsanız, bunun yerine bu kodu kullanabilirsiniz:

val x = "123456789.0".toList.sliding(2).map(x => (x.last, x.head)).toList 

ve o) (,) 3,2 listesi ((2,1 üretecektir (4,3) , ...) (List[(Char, Char)]). Daha sonra daha sonra yazdırabilirsiniz :)