如何检查 Kotlin 列表中的索引是否为空/空?

时间:2021-07-11 05:31:11

标签: kotlin

我想检查 indexarray 是否为空/空,如果是,那么我想在该索引处添加一个新项目,否则用新项目替换旧项目(我不想在数组中保留旧项)。

我尝试了以下代码,但没有用

    private var mSelectedImageFileUriList: ArrayList<Uri?>? = null
mSelectedImageFileUriList= ArrayList(5)

        if (mSelectedImageFileUriList?.get(1) ===null){
                            mSelectedImageFileUriList?.add(data.data!!)
                        }else{
                            mSelectedImageFileUriList?.set(1,data.data!!)
                        }

mSelectedImageFileUriList?.add(data.data!!) 是我之前使用过的代码,它运行没有错误。然后我尝试使用 mSelectedImageFileUriList?.set(0,data.data!!),应用程序崩溃了。我正在检查位置(索引)是否为 null,因为它可能已经被占用,如果它被占用,那么我不想要旧数据,相反,我想用新的(新的一个应该在同一个位置。

它基本上用于创建一个 uri 数组。当用户想要更改图像时,也就是当我想检查用户是否已经在 index 处选择了图像时,如果他选择了图像,则必须删除旧的 uri 并新的应该添加到 array 中的相同位置。

共有 5 张图片,array 的大小限制为 5 (mSelectedImageFileUriList= ArrayList(5))。当用户添加“image1”时,uri 存储在“index0”,当用户添加“image2”时,uri 存储在“index1”。添加'image2'('index1')后,用户想要编辑(更改)他为'image1'添加的图像,如果我使用mSelectedImageFileUriList?.add(data.data!!),它不会删除旧的和新的{{1 }} 被添加到数组的底部,但我希望它在相同的位置,在这种情况下,'index0'。我希望它很清楚。

如果需要,我会添加完整的代码。

uri

logcat

3 个答案:

答案 0 :(得分:1)

您不需要检查 null。因为你总是想更新那个索引,你可以直接设置它。

例如:

fun main() {
    val list = mutableListOf("zero","one",null)
    println(list)
    list[1] = "oneUpdated"
    list[2] = "two"
    println(list)
}

输出:

[zero, one, null]
[zero, oneUpdated, two]

答案 1 :(得分:1)

正如其他人已经说过的,您不必检查该值是否为空,因为在这两种情况下您都可以简单地执行:

list[index] = value

在你的情况下:

mSelectedImageFileUriList?.set(1, data.data!!)

这段代码完全符合您的要求:替换现有值或“添加”(实际上,也替换)如果它为空。

但我认为您的问题确实出在其他地方。您创建了您的列表:

mSelectedImageFileUriList= ArrayList(5)

您可能认为它创建了一个大小为 5 的列表,但事实并非如此。它创建了一个 capacity 为 5 的列表,但它的大小仍然为 0。它不会创建这样的列表:[null, null, null, null, null],而只是:[],因此您无法设置例如的值指数=2。

要创建一个包含空值的大小为 5 的列表,请使用以下代码:

mSelectedImageFileUriList = MutableList(5) { null }

您需要将 mSelectedImageFileUriList 的类型从 ArrayList 更改为 MutableList。这实际上是不鼓励对变量类型使用特定实现类型的原因。

答案 2 :(得分:0)

您已经声明了 ArrayList<Uri?>,这意味着在您的 ArrayList 中包含 Uri 类型或 null 类型。 null 类型仍然在列表中占据一席之地,不被视为“空”空间。

    if (mSelectedImageFileUriList?.get(1) ===null){
                        mSelectedImageFileUriList?.add(data.data!!)
                    }else{
                        mSelectedImageFileUriList?.set(1,data.data!!)
                    }

考虑到这一点,您的代码片段并不完全符合您在描述中所说的那样。您在这里的代码是说如果索引 1 处的元素为空,则将 data 附加到列表的末尾,例如如果您的列表是 [URI1, null],那么您的列表在执行后将变为 [URI1, null, data]

无论哪种方式(null 或旧值),您都希望替换索引 1 处的值,因此您无需检查索引 1 处的值是否为 null 和可以只有一个单行设置器:

mSelectedImageFileUriList?.set(1,data.data!!)