web-dev-qa-db-fra.com

En scala, comment trouver la taille d'un élément de tableau

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 

6
Ezer K

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
2
rajuGT

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.

2
mavarazy

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}")
 }
1
Dima