【问题标题】:How to shift arrays and matrices in Scala如何在 Scala 中移动数组和矩阵
【发布时间】:2016-08-03 06:22:56
【问题描述】:

假设我需要将一个整数数组左右移动。

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

假设我还需要将整数矩阵左右移动

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

上下

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)

现在我想概括 shlshr 以重用它们来上下移动矩阵。你会怎么做?

【问题讨论】:

    标签: arrays scala matrix


    【解决方案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)
    

    【讨论】:

    • 谢谢。 ClassTag 是否意味着运行时反射?
    • 是的,Scala 运行时库需要有关具体类的信息来构造数组(参见stackoverflow.com/questions/16921168/… 的回答)。
    • 哦,我明白了...如果我使用另一个类而不是Array,我可以在没有运行时反射的情况下解决这个问题吗?
    • 是的,您可以使用 Scala 标准库中的大多数集合。对于您的情况,Vector 可能最适合作为运行时表示,因为它具有用于前置和附加的有效恒定时间特性(请参阅docs.scala-lang.org/overviews/collections/…)。
    • 太棒了。再次感谢你。我会尝试Vector 而不是Array
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多