Как редактировать элементы списка в kotlin или добавить во второй список? - PullRequest
0 голосов
/ 12 марта 2019

Я пытался редактировать список на месте, но не смог заставить его работать. Теперь пытаемся редактировать отдельные элементы и добавлять их во второй список. Однако второй список остается нулевым и не обновляется. Любая помощь будет оценена.

        var localFiles: MutableList<String> = File(localPath).list().toMutableList()
        var localFileDates: MutableList<String>? = null
        val iterateLocal = localFileDates?.listIterator()
        for (item in localFiles) {
            var date = item.takeLast(10).take(6)
            if (date.matches("[0-9]+".toRegex()) and (date.length == 6) and (date != null) and (date != "null")) {
                iterateLocal?.add(item.takeLast(10).take(6))
            }
        }
        println(networkFiles) // prints correct outpu
        println(localFileDates) // prints null

Ответы [ 3 ]

0 голосов
/ 12 марта 2019

Лучше использовать функцию map{..} для создания копии списка с обновленными значениями.

val localFiles = File(localPath).list()?.toMutableList() ?: listOf()
val localFileDates = localFiles.mapNotNull { item ->
  val date = item.takeLast(10).take(6)
  if (date.matches("[0-9]{6}".toRegex()) {
    date
  } else {
    null
  }
}

println(localFiles)
println(localFileDates)

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

Вам не нужно var в вашем коде, явные имена типов также могут быть опущены.

Условие можно упростить - проверка нуля не требуется, регулярное выражение фильтрует в нашем случае data == "null", проверку длины также можно включить в регулярное выражение. Переменная date также может быть использована повторно.

0 голосов
/ 12 марта 2019

Более идиоматический (и читабельный) способ:

val localFileDates = File(localPath).list().map { it.takeLast(10).take(6) }.filter {
    it.matches("[0-9]+".toRegex()) && (it.length == 6) && (it != "null")
}

Также я предлагаю вам создать именованную функцию для takeLast(10).take(6) и условие, чтобы прояснить, какова цель этих строк кода.

0 голосов
/ 12 марта 2019

Вам нужна переменная init localFileDates:
var localFileDates = MutableList ()

var localFiles: MutableList<String> = File(localPath).list().toMutableList()
    var localFileDates = MutableList<String>()
    val iterateLocal = localFileDates?.listIterator()
    for (item in localFiles) {
        var date = item.takeLast(10).take(6)
        if (date.matches("[0-9]+".toRegex()) and (date.length == 6) and (date != null) and (date != "null")) {
            iterateLocal?.add(item.takeLast(10).take(6))
        }
    }
    println(networkFiles) // prints correct outpu
    println(localFileDates) // prints correct
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...