удалить все отрицательные элементы из массива буфера целых чисел в Scala - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть вопрос о кодировании.В базе данных есть похожие типы вопросов, с которыми я сталкивался, но ни один из них не устраняет мои сомнения.Я иду через книгу «Скала для нетерпеливых».Приведенный ниже код удаляет отрицательные элементы из массива и дает положительные элементы в качестве вывода

val a = ArrayBuffer(-1, 1, 0, -2, -1, 2, 5, 6, 7)
val positionsToKeep = for (i <- a.indices if a(i) >= 0) yield i
for (j <- positionsToKeep.indices) a(j) = a(positionsToKeep(j))
a.trimEnd(a.length - positionsToKeep.length)

Это дает вывод в виде (1,0,2,5,6,7) удаления всех отрицательных элементов.Я не могу понять строки 3 и 4.

for (j <- positionsToKeep.indices) a(j) = a(positionsToKeep(j))
a.trimEnd(a.length - positionsToKeep.length)

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

1 Ответ

0 голосов
/ 03 февраля 2019

Поскольку a является bufferArray, поэтому мы можем изменять значения массива a.

Строка 3:

Строка 3 заполняется, или вы можете сказать, обновляя значение positionToKeep в a.

a(j) = positionToKeep(j)
// which is running like this 
// a(0) = positionToKeep(0)
// a(1) = positionToKeep(1) .... and so on 

Теперь, что произойдет после заполнения всех значений positionToKeep в a, может случиться, что некоторые старые значения останутся нетронутыми.Четвертая строка удаляет или удаляет эти элементы.В случае, когда у нас есть все положительные значения в массиве, четвертая строка бесполезна, но когда длина a больше, чем positionToKeep, нам нужна строка 4.

Строка 4: рассмотрим сценарий

  1. val a = Array(1, 2, 3, 4, 5, 6)

    Тогда у нашего positionToKeep будет весь элемент, а длина обоих массивов будет равна.

    val positionToKeep = Array(1, 2, 3, 4, 5, 6)
    

    В этом случае в строке четыре trimEnd (0), потому что длина a и positionToKeep равны.

  2. val a = Array( 1, 2, 3, 4, -5, -6, 8, 9, -3)

    В этом случае у нас будет Array(1,2,3,4,8,9) в positionToKeep

В строке 3 мы обновиммассив a и после обновления до четвертой строки так будет выглядеть наш массив a.Array(1,2,3,4,8,9,8,9,-3), поскольку нам нужны значения только до длины 6, поскольку у нас есть только 6 положительных значений.Нам нужно отбросить последние 3 элемента, что делает для нас tripEnd.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...