2015-07-10 5 views
0
class x(x:int){val y=x} 

    class z { 
     val grid= Array.ofDim(8,8) 
    } 

Этот объект уже инициализирован? при попытке инициализации в цикле, какscala: Инициализация массива неизменяемых объектов

for(i<-0 until 8;j<-0 until 8) grid(i)(j)=new x(someValue) 

я получаю ошибку: Исключение нулевого указателя

+0

Btw, класс 'Foo (х: Int) {знач у = х}' и 'класс Foo (значение у: Int) 'по сути то же самое –

ответ

1

Вы можете использовать Array.fill:

Array.fill(8, 8)(myValue) 

Или вы можете использовать toArray с вложенным for Понимание:

{ 
    for { 
    i <- 0 until 8 
    } yield { for { 
    j <- 0 until 8 
    } yield myValue 
}.toArray }.toArray 

Кроме того, вы можете использовать toArray с map:

(0 until 8).map { _ => (0 until 8).map { _ => myValue }.toArray }.toArray 

Вы также могли бы использовать некоторую комбинацию этих подходов:

Array.fill(8){ { for(_ <- (0 until 8)) yield myValue }.toArray } 
0

Массивы по определению изменчивый в Scala. Это, по сути, массивы Java, дополненные множеством интересных API-интерфейсов Scala.

Основная проблема с тем, что у вас есть, - отсутствующая параметризация параметра массива. Указав, что массив типа [X] то следующий код работает для меня:

class X(x:Int){val y=x} 

class Z { 
    val grid= Array.ofDim[X](8,8) 
    for(i<-0 until 8;j<-0 until 8) grid(i)(j)=new X(2) 
} 
+0

i указанный параметр типа, все та же проблема, У меня есть несколько частей массива с одним значением и оставшимися частями с другим значением. Он работает при использовании var, но я не хочу использовать var – xrs

+0

Можете ли вы добавить точный код, который у вас есть или что-то более близкое к тому, как вы заполняете массив? Var или Val не должны иметь большого значения в этой настройке. – marios

+0

У меня есть 2d массив объектов. Сначала я должен инициализировать некоторые части массива рандомизацией, а затем оставшиеся части в зависимости от тех ранних инициализированных частей. для (i <-0 до 8) { – xrs

Смежные вопросы