【问题标题】:What is the correct way to get a subarray in Scala?在 Scala 中获取子数组的正确方法是什么?
【发布时间】:2012-06-05 13:17:02
【问题描述】:

我正在尝试在 scala 中获取一个子数组,但我对正确的做法有点困惑。我最想要的是你如何在 python 中做到这一点:

x = [3, 2, 1]
x[0:2]

但我相当肯定你不能这样做。

最明显的方法是使用 Java Arrays util library。

import java.util.Arrays
val start = Array(1, 2, 3)
Arrays.copyOfRange(start, 0, 2)

但是在 Scala 中使用 Java 库总是让我觉得有点脏。我发现最“scalaic”的方式是

def main(args: List[String]) {
    val start = Array(1, 2, 3)
    arrayCopy(start, 0, 2)
}
def arrayCopy[A](arr: Array[A], start: Int, end: Int)(implicit manifest: Manifest[A]): Array[A] = {
    val ret = new Array(end - start)
    Array.copy(arr, start, ret, 0, end - start)
    ret
}

但是有更好的方法吗?

【问题讨论】:

    标签: scala scala-collections


    【解决方案1】:

    可以调用切片方法:

    scala> Array("foo", "hoo", "goo", "ioo", "joo").slice(1, 4)
    res6: Array[java.lang.String] = Array(hoo, goo, ioo)
    

    它就像在 python 中一样工作。

    【讨论】:

    • 是的,你是对的。我指的是有约束力的约定。包括下限,排除上限。没有尾随 : 也没有。
    • @nnythm 链接是head。
    • 看起来我无法编辑过时的评论,但活动链接是:scala-lang.org/api/2.12.8/scala/collection/mutable/…
    • @nnythm 但是您可以删除旧评论;)
    【解决方案2】:

    假设您有一个数组,其中包含从 af 的元素

    scala> val array = ('a' to 'f').toArray // Array('a','b','c','d','e','f')
    

    然后你可以用不同的方式从中提取一个子数组:

    1. drop(n: Int)删除前n个元素

      array.drop(2) // Array('c','d','e','f')

    2. take(n: Int)取前n个元素

      array.take(4) // Array('a','b','c','d')

    3. 使用slice(from: Int, until: Int) 选择任意间隔的元素。请注意,until 被排除在外。

      array.slice(2,4) // Array('c','d')

      切片方法严格等价于:
      array.take(4).drop(2) // Array('c','d')

    4. dropRight(n: Int)排除最后n个元素:

      array.dropRight(4) // Array('a','b')

    5. takeRight(n: Int)选择最后n个元素:

      array.takeRight(4) // Array('c','d','e','f')

    参考Official documentation

    【讨论】:

      【解决方案3】:

      从 2D Scala Array (original_array) 中提取特定列的示例:

      import scala.collection.mutable.ArrayBuffer
      
      val sub_array = ArrayBuffer[Array[String]]()
      val columns_subset: Seq[String] = Seq("ColumnA", "ColumnB", "ColumnC")
      val columns_original = original_array(0)
      
      for (column_now <- columns_subset) {
            sub_array += original_array.map{_(columns_original.indexOf(column_now))}
          }
      sub_array
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-09
        • 2012-11-01
        • 2014-07-04
        • 1970-01-01
        • 2020-04-16
        相关资源
        最近更新 更多