在 Scala 中,如何找到数组元素的大小
In scala, how can I find the size of an array 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
^
我做错了什么?
谢谢
当您使用以下文字创建数组时
val aaa = Array("a", "b", Array(1, 2, 3), "c")
由于元素类型不同,数组aaa
类型创建为java.io.Serializable
aaa: Array[java.io.Serializable] = Array(a, b, Array(1, 2, 3), c)
因此,当您引用第二个元素时,引用的类型将为 Serializable
,并且其中没有大小 属性。所以我们需要使用 asInstanceOf 将第二个元素 typecast/convert 显式化为 Array。如下图
if (aaa(2).isInstanceOf[Array[Int]])
aaa(2).asInstanceOf[Array[Int]].size
声明的最常见类型是可序列化的
val aaa = Array("a", "b", Array(1, 2, 3), "c")
Array[java.io.Serializable]
如果想和size一起使用,可以显式定义:
val aaa: Array[Seq[Any]] = Array("a", "b", Array(1, 2, 3), "c")
在这种情况下,所有字符串都将转换为字符序列。
如评论中所述,在一个数组中混合数组和非数组(以及通常不同类型的元素)不是一个好主意。有时,当您无法避免必须这样做时,会出现极端情况,但通常情况下,数组(和其他 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}")
}
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
^
我做错了什么? 谢谢
当您使用以下文字创建数组时
val aaa = Array("a", "b", Array(1, 2, 3), "c")
由于元素类型不同,数组aaa
类型创建为java.io.Serializable
aaa: Array[java.io.Serializable] = Array(a, b, Array(1, 2, 3), c)
因此,当您引用第二个元素时,引用的类型将为 Serializable
,并且其中没有大小 属性。所以我们需要使用 asInstanceOf 将第二个元素 typecast/convert 显式化为 Array。如下图
if (aaa(2).isInstanceOf[Array[Int]])
aaa(2).asInstanceOf[Array[Int]].size
声明的最常见类型是可序列化的
val aaa = Array("a", "b", Array(1, 2, 3), "c")
Array[java.io.Serializable]
如果想和size一起使用,可以显式定义:
val aaa: Array[Seq[Any]] = Array("a", "b", Array(1, 2, 3), "c")
在这种情况下,所有字符串都将转换为字符序列。
如评论中所述,在一个数组中混合数组和非数组(以及通常不同类型的元素)不是一个好主意。有时,当您无法避免必须这样做时,会出现极端情况,但通常情况下,数组(和其他 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}")
}