Поле ArrayList собрано неправильно - PullRequest
0 голосов
/ 02 апреля 2020

Я на самом деле новичок в Kotlin, и я сталкиваюсь со следующей проблемой c:

У меня есть класс, содержащий ArrayList класса EnsembleVerifier. Этот другой класс создается с помощью ArrayList of Square. Когда я попытался получить этот ArrayList, я обнаружил, что у него нет элемента внутри.

Есть ли в моем коде абсурд / заблуждение? Это что-то еще? Заранее спасибо! :)

GridVerifiers.kt

class GridVerifiers(private val grid: Grid) {
   private var verifiers: ArrayList<EnsembleVerifier> = ArrayList()

   init {
      generateVerifiers()
   }

   private fun generateVerifiers() {
      generateLineVerifiers()
      generateColumnVerifiers()
      generateSubGridVerifiers()
   }

   private fun generateLineVerifiers() {
      val line: ArrayList<Square> = ArrayList()

      for (lineIndex in grid.gridState.indices) {
         for (columnIndex in grid.gridState.indices)
            line.add(grid.gridState[lineIndex][columnIndex])
         println(line.size) // returns 9
         verifiers.add(EnsembleVerifier(line))
         line.clear()
      }
   }

   ...

EnsembleVerifier.kt

class EnsembleVerifier(private val squares: ArrayList<Square>) {

   ...

   fun isValid(): Boolean {
      val buffer: ArrayList<Int> = ArrayList()
      println(squares.size) // returns 0!
      for (square in squares) {
         if (square.value in buffer) return false
         buffer.add(square.value)
      }
      return true
   }

1 Ответ

0 голосов
/ 02 апреля 2020

В java большую часть времени вы работаете со ссылками на объекты. В вашем случае это означает, что вы всегда работаете с одним и тем же массивом line. Поэтому, когда вы вызываете line.clear, вы очищаете массив, на который указывает эта ссылка, и это вызывает вашу проблему с пустыми массивами.

Вам необходимо каждый раз генерировать новые объекты вместо очистки списка.

private fun generateLineVerifiers() {
  for (lineIndex in grid.gridState.indices) {
    val line: ArrayList<Square> = ArrayList()    
    for (columnIndex in grid.gridState.indices)
      line.add(grid.gridState[lineIndex][columnIndex])
    println(line.size) // returns 9
    verifiers.add(EnsembleVerifier(line))
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...