Scala newbie, avoir un tableau où un élément est un tableau:
val aaa = Array("a", "b", Array(1, 2, 3), "c")
Cela marche:
In []: aaa(2)
Out[]: Array(1, 2, 3)
Cela marche
In []: Array(1, 2, 3).size
Out[]:3
Cela ne veut pas:
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
^
Qu'est-ce que je fais mal? Thnaks
Lorsque vous créez un tableau en utilisant le littéral suivant
val aaa = Array("a", "b", Array(1, 2, 3), "c")
Le type des éléments étant différent, le type de tableau aaa
est créé avec Java.io.Serializable
aaa: Array[Java.io.Serializable] = Array(a, b, Array(1, 2, 3), c)
Ainsi, lorsque vous renvoyez le deuxième élément, le type de la référence sera de Serializable
et il ne contient aucune propriété de taille. Nous devons donc explicitement transtyper/convertir le deuxième élément en tableau à l'aide de asInstanceOf . Comme indiqué ci-dessous
if (aaa(2).isInstanceOf[Array[Int]])
aaa(2).asInstanceOf[Array[Int]].size
Le type le plus courant pour votre déclaration est sérialisable
val aaa = Array("a", "b", Array(1, 2, 3), "c")
Array[Java.io.Serializable]
Si vous voulez l'utiliser avec la taille, vous pouvez définir explicitement:
val aaa: Array[Seq[Any]] = Array("a", "b", Array(1, 2, 3), "c")
toutes les chaînes seront converties en séquences de caractères dans ce cas.
Comme mentionné dans les commentaires, il n'est pas judicieux de mélanger des tableaux et des non-tableaux (et, en général, des éléments de types différents) dans un tableau. Parfois, dans certains cas, vous ne pouvez pas vous en sortir, mais en règle générale, les tableaux (et autres conteneurs Scala) sont conçus pour contenir des types homogènes.
Je recommanderais donc de commencer par diviser votre tableau en deux:
val (arrays, nonArrays) =
Array("a", "b", Array(1, 2, 3), "c").partition {
case a: Array[_] => true
case _ => false
}
Maintenant, vous pouvez facilement connaître la longueur de tous vos tableaux:
arrays.foreach { println(_.size) }
Si vous souhaitez conserver les informations de position d'origine, vous pouvez d'abord compresser le tableau d'origine avec des index:
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}")
}