2015-10-24 2 views
1

Рассмотрим следующий фрагмент кода:Scala: Список Массивы

val mapOfArrays = (0 to 10).map{ 
    Array(1, 2) 
} 

Я ожидал, что выход будет типа List[Array[Int]], но это не так. Есть идеи?

enter image description here

+3

Вы можете написать это как 'List.fill (11) (Array (1,2))'. –

ответ

3

карта вызов ожидает функции в качестве параметра, но вы передаете массив из двух значений. Затем он попытается вызвать применение этого массива с каждым элементом диапазона.

Я считаю, что это то, что вы намеревались.

val mapOfArrays = (0 to 10).map(item => Array(1,2)) 
+3

Массив * является * a 'Function1 [Int, T]' (точнее: 'Seq' является' PartialFunction [Int, T] ') от его индексов до его значений, поэтому код OP« работает », в первую очередь. –

6

Запуск его в РЕПЛ показывает, что на самом деле вызывает исключение:

scala> val mapOfArrays = (0 to 10).map{ 
    | Array(1, 2) 
    | } 
java.lang.ArrayIndexOutOfBoundsException: 2 
    at scala.collection.mutable.WrappedArray$ofInt.apply$mcII$sp(WrappedArray.scala:155) 
    at scala.collection.mutable.WrappedArray$ofInt.apply(WrappedArray.scala:155) 
    at scala.collection.mutable.WrappedArray$ofInt.apply(WrappedArray.scala:152) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245) 
    at scala.collection.immutable.Range.foreach(Range.scala:166) 
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:245) 
    at scala.collection.AbstractTraversable.map(Traversable.scala:104) 
    ... 37 elided 

Это потому, что код эквивалентен:

val mapOfArrays = (0 to 10).map{ 
    Array(1, 2).apply 
} 

или более многословным

val mapOfArrays = (0 to 10).map{ x => 
    Array(1, 2).apply(x) 
} 

который действительно является IndexedSeq[Int].


Метод .apply от Array возвращает элемент по данному индексу, который бросает ArrayIndexOutOfBoundsException когда x (от (0 to 10)) reachs 2.

Изменение кода так, чтобы он не сгенерирует исключение:

scala> val mapOfArrays = (0 to 3).map{ Array(1, 2, 3, 4, 5) } 
mapOfArrays: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4) 

Я предполагаю, что вы хотели, чтобы написать вместо этого:

scala> val mapOfArrays = (0 to 10).map{ x => 
     Array(1, 2) 
     } 
mapOfArrays: scala.collection.immutable.IndexedSeq[Array[Int]] = Vector(Array(1, 2), Array(1, 2), Array(1, 2), Array(1, 2), Array(1, 2), Array(1, 2), Array(1, 2), Array(1, 2), Array(1, 2), Array(1, 2), Array(1, 2)) 
Смежные вопросы