2016-08-03 11 views
1

Angenommen, ich muss ein Array von ganzen Zahlen nach links und rechts verschieben.Wie verschiebt Arrays und Matrizen in Scala

val shl : Array[Int] => Array[Int] = a => (a drop 1) :+ 0 
val shr : Array[Int] => Array[Int] = a => 0 +: (a dropRight 1) 

Angenommen, ich auch eine Matrix von ganzen Zahlen verschieben müssen links und rechts

val shlm: Array[Array[Int]] => Array[Array[Int]] = _ map shl 
val shrm: Array[Array[Int]] => Array[Array[Int]] = _ map shr 

und nach oben und unten

val zeros: Int => Array[Int] = n => Array.fill(n)(0) 
val shum: Array[Array[Int]] => Array[Array[Int]] = m => (m drop 1) :+ zeros(m.length) 
val shdm: Array[Array[Int]] => Array[Array[Int]] = m => zeros(m.length) +: (m dropRight 1) 

Nun möchte Ich mag verallgemeinernshl und shr um sie für das Verschieben der Matrix nach oben und unten wiederzuverwenden. Wie würdest du das machen?

Antwort

1
import scala.reflect.ClassTag 

type ArrayOp[T] = Array[T] => Array[T] 

def shl[T:ClassTag](zero: T)(a: Array[T]): Array[T] = (a drop 1) :+ zero 
def shr[T:ClassTag](zero: T)(a: Array[T]): Array[T] = zero +: (a dropRight 1) 

val shlm: ArrayOp[Array[Int]] = _ map shl(0) 
val shrm: ArrayOp[Array[Int]] = _ map shr(0) 

val zeros: Int => Array[Int] = n => Array.fill(n)(0) 

val shum: ArrayOp[Array[Int]] = m => shl(zeros(m.length))(m) 
val shdm: ArrayOp[Array[Int]] = m => shr(zeros(m.length))(m) 
+0

Danke. Bedeutet der 'ClassTag' Laufzeit-Reflektion? – Michael

+0

Ja, die Scala-Laufzeitbibliothek benötigt die Informationen über die konkrete Klasse, um das Array zu erstellen (siehe Antwort zu http://stackoverflow.com/questions/16921168/scala-generic-method-no-classtag-available-for-t) . – devkat

+0

Oh, ich verstehe ... Kann ich dieses Problem ohne Laufzeit-Reflektion lösen, wenn ich eine andere Klasse anstelle von 'Array' verwende? – Michael