2016-10-16 1 views
1

Я новичок в Scala, и я пытаюсь создать список массивов рекурсивно в scala, вот код, который у меня есть, он не бросает никаких ошибок при запуске, но, его ничего не печатает, когда я пытаюсь unCons.foreach (Println)Создайте список массивов рекурсивно в Scala

val Tot = 5 
val Num = 5 

var unCons = ListBuffer[String]() 

    for(j <- 1 to Tot) 
     { 
     var OurArr = ListBuffer[String]() 

     for(i <- 1 to Num) 
     { 
      OurArr:+("true") 
     } 

     unCons:+(OurArr.toList) 
} 

в результате я ожидал что-то вроде этого

[[true, true, true, true, true], 
[true, true, true, true, true], 
[true, true, true, true, true], 
[true, true, true, true, true], 
[true, true, true, true, true]] 

Любая идея, где я неправильно?

+0

Что в результате вы получаете то? – user5055454

+0

ничего. unCons.foreach (println) ничего не печатает. – DnP

+0

Ах. unCons - это ListBuffer of Strings, но на самом деле вы помещаете ListBuffer [Strings] внутри. – user5055454

ответ

0

Любая идея, где я неправильно?

Есть три ошибки вы делаете:

  1. unCons имеет типа ListBuffer[String]. OurArr также имеет тип ListBuffer[String]. Вы пытаетесь добавить коллекцию OurArr в unCons, которая даст вам ошибку несоответствия типа. unCons принимает только элементы типа String, пока вы пытаетесь добавить к нему элементы типа ListBuffer[String]. Таким образом, первый сделать свой unCons типа ListBuffer [ListBuffer [String]], так что он может принимать элементы типа OurArr

  2. Вы используете: + метод для добавления элементов в вашей коллекции OurArr OurArr:+("true"), который возвращает новый коллекция вместо редактирования эта коллекция на месте.

    От scaladoc:

Защита + :(эль: A): ListBuffer [A] Копия буфера списка с элементом предварённым.

В вашем случае вы должны использовать OurArr += ("true"), который редактирует вашу коллекцию на месте и не возвращает новую коллекцию.

Вы бы предположили, что операции с изменчивыми коллекциями возвратят одну и ту же коллекцию после операций. Но это не тот случай. Многие операции с изменяемыми коллекциями возвращают новую копию коллекции, и вам нужно будет захватить эту новую коллекцию.

  1. Эта строка: unCons:+(OurArr.toList) вызывает ту же проблему, что и # 2 выше. Оператор: + возвращает новую коллекцию, и вы не собираете эту коллекцию в переменной. Вместо этого вы можете использовать unCons += OurArr для редактирования коллекции.

Последнее, но не менее важное, вы должны ИЗБЕЖАТЬ ВАРС, насколько это возможно, в Скале. Вы будете удивлены, что вам редко приходится использовать var в Scala. Например, в вашем случае вы использовали два ВАР:

var unCons = ListBuffer[String]() 
var OurArr = ListBuffer[String]() 

Оба из них могут быть Вэла без каких-либо изменений на поведение вашего кода. Помните, что когда вы объявляете объект как val, это НЕ означает, что вы можете изменить/отредактировать содержимое объекта. Единственное различие заключается в том, что вы не можете изменить указатель, чтобы указать на какой-то другой адрес памяти. Таким образом, в обоих ваших случаях вы можете смело использовать Vals:

Так что ваш код становится:

val Tot = 5 
val Num = 5 

    val unCons = ListBuffer[ListBuffer[String]]() 

     for(j <- 1 to Tot) 
     { 
     val OurArr = ListBuffer[String]() 

     for(i <- 1 to Num) 
      { 
      OurArr += ("true") 
      } 

     unCons += OurArr 
    } 
+0

Samar, Большое вам спасибо за подробное объяснение. – DnP

+0

Рад, что это помогло :) – Samar

1

У вас есть ряд проблем.

Сначала вы неправильно назначаете ListBuffer.

OurArr :+= "true" 

Следующая вы unCons неправильный тип для того, что вы пытаетесь сделать.

var unCons = ListBuffer[List[String]]() 

После этих исправлений вы хотите посмотреть в хорошей практике Scala, как избежать использования var всякий раз, когда это возможно (и это почти всегда возможно).

Еще одна вещь: в этом коде нет рекурсии. Если вы пытаетесь создать список рекурсивно (как подсказывает название вопроса), вам нужен совершенно другой подход.

2

"Scala путь" может быть использование List.fill

scala> List.fill(5)(List.fill(5)(true)) 
res0: List[List[Boolean]] = List(List(true, true, true, true, true), List(true, true, true, true, true), List(true, true, true, true, true), List(true, true, true, true, true), List(true, true, true, true, true)) 
+0

Спасибо Брайан, Это работает. – DnP

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