2016-06-13 6 views
3

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 
       ^

私は間違っていますか? Thnaks

+0

タイプ 'aaa'vaこんにちは –

+0

どうすればいいですか? –

+0

これは配列のようです –

答えて

1

を使用して、配列を作成するには、次のリテラルの要素の種類が異なっているので、配列aaaタイプはたjava.io.Serializable

aaa: Array[java.io.Serializable] = Array(a, b, Array(1, 2, 3), c) 
を使用して作成され

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

したがって、2番目の要素を参照すると、参照のタイプはSerializableとなり、サイズプロパティはありません。ですから、asInstanceOfを使用して、2番目の要素を明示的に型変換/配列に変換する必要があります。

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

すべての文字列は次のようになります。

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

チェックを外すことは避けてください。それは危険で「コード臭い」です。 – Dima

2
あなたの宣言の

最も一般的なタイプは、あなたがサイズでそれを使用したい場合は、明示的に定義することができ

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

直列化可能である以下に示すようにこの場合、Charsのシーケンスに変換されます。

+0

これは、valが設定された後に条件コードを必要としないため、良いことです。 –

1

コメントに記載されているように、配列と非配列(一般的には異なる型の要素)を配列に混ぜることはお勧めできません。時にはコーナーケースがありますが、それをやり遂げることができないときには、配列(と他のスカラコンテナ)は原則として同種の型を保持することを意味します。

だから、私は2つにあなたのアレイを分割して開始することをお勧めします:

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}") 
} 
+0

'arrays.foreach {println(_。size)}'行が機能しません。 _は引き続き 'java.io.Serializable'型を参照しており、' size'はSerializable型のメンバではありません。最初のブロック '配列'を実行した後のFYIは 'arrays:Array [配列](Array(1、2、3))'を参照しています。 – rajuGT

+0

私はこれを試して、それは動作していないようでした - まだSerializable :( –

関連する問題