在scala中,如何找到数组元素的大小

时间:2016-06-13 10:18:29

标签: arrays scala size element

Scala新手,有一个数组,其中一个元素是一个数组:

val aaa = Array("a", "b", Array(1, 2, 3), "c")

这有效:

In []: aaa(2)
Out[]: Array(1, 2, 3)

这有效:

In []: Array(1, 2, 3).size
Out[]:3

这不是:

In []: aaa(2).size
Out[]:
Name: Compile Error
Message: <console>:15: error: value size is not a member of                     
java.io.Serializable
          aaa(2).size
                 ^

我做错了什么? 感谢

3 个答案:

答案 0 :(得分:3)

使用以下文字

创建数组时
val aaa = Array("a", "b", Array(1, 2, 3), "c")

由于元素的类型不同,因此使用 java.io.Serializable

创建数组aaa类型
aaa: Array[java.io.Serializable] = Array(a, b, Array(1, 2, 3), c)

因此,当您引用第二个元素时,引用的类型将为Serializable,并且其中没有大小属性​​。所以我们需要使用 asInstanceOf 明确地对第二个元素进行类型转换/转换为数组。如下图所示

 if (aaa(2).isInstanceOf[Array[Int]]) 
       aaa(2).asInstanceOf[Array[Int]].size

答案 1 :(得分:3)

您声明的最常见类型是可序列化的

val aaa = Array("a", "b", Array(1, 2, 3), "c")
Array[java.io.Serializable] 

如果要将其与大小一起使用,可以明确定义:

val aaa: Array[Seq[Any]] = Array("a", "b", Array(1, 2, 3), "c")

在这种情况下,所有字符串都将转换为字符序列。

答案 2 :(得分:1)

正如评论中所提到的,在数组中混合数组和非数组(以及通常不同类型的元素)并不是一个好主意。有时,有一些极端情况,当你无法解决这个问题时,但通常情况下,数组(和其他scala容器)意味着保持同类型。

所以,我建议首先将数组拆分为两个:

val (arrays, nonArrays) =  
  Array("a", "b", Array(1, 2, 3), "c").partition { 
     case a: Array[_] => true
     case _ => false
  }

现在,您可以轻松判断所有阵列的长度:

  arrays.foreach { println(_.size) }

如果您想保留原始位置信息,可以先用索引压缩原始数组:

 val (arrays, nonArrays) = Array("a", "b", Array(1, 2, 3), "c")
   .zipWithIndex
   .partition {
      case (a: Array[_], _) => true
      case _ => false
   }

 arrays.foreach { 
   case (array, index) => 
     prinlnt(s"Array length at index $index is ${array.size}")
 }