【问题标题】:Kotlin List<List<String>> when instantiating creates 1 empty elementKotlin List<List<String>> 在实例化时创建 1 个空元素
【发布时间】:2023-02-06 02:58:09
【问题描述】:

解决算法任务并遇到一个我以前没有注意的有趣情况。

这是例子:

 val testList1 = mutableListOf<String>()

    testList1.add("f")
    testList1.add("n")

    Toast.makeText(this, testList1.size.toString(), Toast.LENGTH_SHORT).show()

在此代码中,我的 toast 将返回大小 2。这是可以预期的。 但让我们举个例子:

val testList2 = mutableListOf(mutableListOf<String>())

    testList2.add(mutableListOf("sf", "fgs"))
    testList2.add(mutableListOf("sw", "fgg"))

    Toast.makeText(this, testList2.size.toString(), Toast.LENGTH_SHORT).show()

这里的 toast 显示 size = 3,即使我添加了 2 个元素(2 个列表)。因此,在实例化时它会添加 1 个 emptyList 作为第一个元素。

解决这个问题不是什么大问题,我们可以:

var finalList = testList2.removeIf { it.isEmpty() }

但我很好奇为什么会这样。还有什么好的方法可以避免它。如果可能的话想多了解一点

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    testList2 包含 3 个对象并不奇怪。 testList2 是用一个初始的空列表构造的。

    
    val testList2 = mutableListOf(mutableListOf<String>())
    
    // using
    public fun <T> mutableListOf(vararg elements: T): MutableList<T> =
        if (elements.size == 0) ArrayList() else ArrayList(ArrayAsCollection(elements, isVarargs = true))
            
    

    在这里,您可以通过这些代码定义一个空的可变列表。

    val testList: MutableList<MutableList<String>> = mutableListOf()
    
    // or
    val testList = mutableListOf<MutableList<String>>()
    
    // using
    public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
    

    【讨论】:

      【解决方案2】:

      无论您传递给mutableListOf 函数是它返回的列表的初始内容。由于您在对 mutableListOf() 的外部调用中嵌套了对 mutableListOf() 的调用,因此您正在使用另一个 MutableList 的初始值创建列表。

      如果您希望您的列表一开始是空的,请不要在调用 mutableListOf() 时在 () 中放置任何内容。

      如果以这种方式构建列表,则需要指定列表的类型,因为它没有可从中推断类型的参数。

      任何一个

      val testList2 = mutableListOf<MutableList<String>>()
      

      或者

      val testList2: MutableList<MutableList<String>> = mutableListOf()
      

      【讨论】:

        猜你喜欢
        • 2021-09-04
        • 2021-11-03
        • 2020-10-21
        • 2020-12-18
        • 2020-04-01
        • 2013-08-15
        • 1970-01-01
        • 2018-10-13
        • 2020-03-10
        相关资源
        最近更新 更多