我如何在for循环中修改List的元素

时间:2018-08-08 06:11:15

标签: android list loops for-loop kotlin

我想比较版本名称,但要这样做,我必须使它们符合相同的标准,即Major.Minor.Patch(例如1.3.21)。 问题是我无法更改要迭代的元素。

我将版本存储为List,然后将所有版本存储在另一个列表中,并将其作为变量传递给以下函数。

var version_a = listOf(1)
var version_b = listOf(1, 2)
var version_c = listOf(1, 2, 3)
val versions = listOf(version_a, version_b, version_c)
adjustLengthExample(versions)

fun adjustLengthExample(versions: List<List<Int>>){
   for((index, version) in versions.withIndex()){
      while(version.size < 3){  
         version = mutableListOf().addAll(version).add(0) //using element: Error Val cannot be reassigned

         versions[index] = mutableListOf().addAll(version).add(0) //using indexed position: Error: No set method providing array access
      }
   }
}
versions.foreach(Log.d(TAG, it.toString())) //Expected output: [1,0,0][1,2,0][1,2,3]

如何访问version_a / b / c并设置/更改其值?

2 个答案:

答案 0 :(得分:2)

代替

var version_a = listOf(1)

使用

val version_a = mutableListOf(1)

然后在while循环中只需更改列表的内容

while(version.size < 3) {  
    version.add(0) 
    // or
    versions[index].add(0) 
}

这是完整的示例:

fun main(args: Array<String>) {

    fun adjustLengthExample(versions: List<MutableList<Int>>){
        for((index, version) in versions.withIndex()){
            while(version.size < 3){
                version.add(0)
                // or
                //versions[index].add(0)
            }
        }
    }

    val version_a = mutableListOf(1)
    val version_b = mutableListOf(1, 2)
    val version_c = mutableListOf(1, 2, 3)
    val versions = listOf(version_a, version_b, version_c)

    adjustLengthExample(versions)

    versions.forEach { println(it) } 
}

这将输出:

[1, 0, 0]
[1, 2, 0]
[1, 2, 3]

要对不可变列表执行相同操作,必须创建新列表,并且adjustLengthExample必须返回新列表。像这样:

fun main(args: Array<String>) {

    fun adjustLengthExample(versions: List<List<Int>>): List<List<Int>> {
        var result: List<List<Int>> = listOf()

        for ((index, version) in versions.withIndex()) {
            var newVersion: List<Int> = version
            while (newVersion.size < 3) {
                newVersion += 0
            }
            result += listOf(newVersion)
        }
        return result
    }

    val version_a = listOf(1)
    val version_b = listOf(1, 2)
    val version_c = listOf(1, 2, 3)
    var versions = listOf(version_a, version_b, version_c)

    versions = adjustLengthExample(versions)

    versions.forEach { println(it) } 
}

答案 1 :(得分:2)

有一个更简单的方法可以实现:

val versions = listOf(listOf(1), listOf(1, 2), listOf(1, 2, 3))

val result = versions.map {
    (it + listOf(0, 0, 0)).subList(0, 3)
}

println(result)

输出:

[[1, 0, 0], [1, 2, 0], [1, 2, 3]]