scala - 如何定义可以是 Array 或 List 的变量

标签 scala scala-collections

可能是一个菜鸟问题,但我想在一个简短的脚本中做这样的事情:

val s = if ( <some condition> ) Array(...) else List(...)
print(s.length)

问题是 s 将被推断为 Object,因为 ArrayList 没有共同的父类(super class)。因此第二行给出了一个错误,因为 Object 没有 length 方法。

提前致谢!

更新

呸,很遗憾我不能接受多个答案!谢谢你们的帮助,伙计们!我玩 Scala 有一段时间了,但似乎我还有很多东西要学:-)

最佳答案

您可以对Array 使用包装器并将s 用作Seq[T]:

scala> val s = if (true) Array(1): Seq[Int] else List(1)
s: Seq[Int] = WrappedArray(1)

对于多维数组,您可以像这样创建自己的转换器:

implicit class ArrArrWrap[T](a: Array[Array[T]]) extends IndexedSeq[WrappedArray[T]] {
  def length = a.length
  def apply(idx: Int) = a(idx): WrappedArray[T]
}

用法:

scala> val s = if (true) Array(Array(1)): Seq[Seq[Int]] else List(List(1))
s: Seq[Seq[Int]] = (WrappedArray(1))

使用多维数组作为多维序列的想法有一个很大的缺点:

它涉及到除最后一个维度之外的每个维度的访问转换。

s(0) // <- conversion here

因此它可能会导致性能问题。将 Array 转换为 Seq 可能会更好:

scala> val s = if (true) Array(Array(1)).map{ i => i: Seq[Int] }(breakOut) else List(List(1))
s: scala.collection.immutable.Seq[Seq[Int]] = Vector(WrappedArray(1))

关于scala - 如何定义可以是 Array 或 List 的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17177787/

相关文章:

scala - sbt 更新未解析存储库中的最新工件

mysql - 玩框架scala和mysql报错

scala - 检查键是否存在于scala Map中

list - 如何将元组添加到 List 并避免 java.lang.UnsupportedOperationException

scala - 在 Scala 中更新 key

scala - 递归返回 Future.Right 的串联

java - 在 Scala 插件中控制错误的 IntelliJ 代码编辑器错误

java - 在 Linux/Java/Scala 中枚举附加的 DVD 驱动器

scala - 按值获取 Scala 映射中的最大键值对

scala - 我应该如何将九个 for 循环重新组织为生成迭代器或集合的东西?