如何在 Kotlin 中从数组列表中移除项目

6
data class RideDate(var enddate: String? = null,var startdate: String? = null) 



 fun main(args: Array<String>) {
var listOfRideDate = mutableListOf<RideDate>();
val date1 = RideDate()
date1.startdate = "2018-11-05 00:00:00 +0000"
date1.enddate = "2018-11-06 23:59:59 +0000"
listOfRideDate.add(date1)

val date2 = RideDate()
date2.startdate = "2020-01-20 00:00:00 +0000"
date2.enddate = "2020-02-20 00:00:00 +0000"
listOfRideDate.add(date2)

val date3 = RideDate()
date3.startdate = "2020-03-20 00:00:00 +0000"
date3.enddate = "2020-03-20 00:00:00 +0000"
listOfRideDate.add(date3)

val date4 = RideDate()
date4.startdate = "2020-04-20 00:00:00 +0000"
date4.enddate = "2020-04-20 00:00:00 +0000"
listOfRideDate.add(date4)

val date5 = RideDate()
date5.startdate = "2020-11-20 00:00:00 +0000"
date5.enddate = "2020-11-20 00:00:00 +0000"
listOfRideDate.add(date5)


for (i in 0..listOfRideDate.size -1) {
    // we have to remove 2018-11-05 00:00:00 +0000 and 2018-11-06 23:59:59 +0000  from list 
    println(listOfRideDate.get(i).startdate + " and " + listOfRideDate.get(i).enddate)
}

这是我的数据类,我手动添加了startDate和endDate的RideDate项。如果数据包含日期1.startdate =“2018-11-05 00:00:00 +0000”和date1.enddate =“2018-11-06 23:59:59 +0000”,我想动态删除该项,以便我可以忽略它。请帮我学习如何在 Kotlin 中从数组列表中删除该项。

3个回答

10
你可以使用removeAll,如果元素符合条件,就可以从原始列表中删除它。
listOfRideDate.removeAll {
    it.startdate == "2018-11-05 00:00:00 +0000" && it.enddate == "2018-11-06 23:59:59 +0000"
}

或者,你可以按照Johann Kexel的建议,通过创建一个带有过滤项目的新列表进行过滤

val filtertedList = listOfRideDate.filter {
    it.startdate == "2018-11-05 00:00:00 +0000" && it.enddate == "2018-11-06 23:59:59 +0000"
}

2
您可以在您的情况下使用filter
val filtertedList = listOfRideDate.filter { element -> someLogik(element)}

还可以参考以下页面

Kotlinlang过滤器


请问您能帮我在哪里添加这段代码吗?我对这个函数非常陌生,不知道该如何应用条件和如何在这里应用someLogik(element)。 - MARSH
请问如何为开始日期和结束日期应用过滤器?请帮帮我。 - MARSH
@MARSH,您是想从原始列表中删除元素还是创建一个新的过滤列表? - Animesh Sahu
someLogik 只是一个示例,代表一个返回布尔值的函数,您可以自己定义。例如 fun nonNull(element:RideDate) = element != null。您可以在 foreach 循环之前或之后使用此过滤逻辑。 - Johann Kexel

2

Like this:

loop@ for (i in 0 until listOfRideDate.size) {
        // we have to remove 2018-11-05 00:00:00 +0000 and 2018-11-06 23:59:59 +0000  from list
        if (listOfRideDate.get(i).startdate == "2018-11-05 00:00:00 +0000" &&  listOfRideDate.get(i).enddate == "2018-11-06 23:59:59 +0000"){
            listOfRideDate.removeAt(i)
            break@loop
        }
    }

或者

listOfRideDate.removeIf {
     it.startdate == "2018-11-05 00:00:00 +0000" &&  it.enddate == "2018-11-06 23:59:59 +0000"
}

它显示异常:在线程“main”中,java.lang.IndexOutOfBoundsException:索引:4,大小:4。 - MARSH
1
你不能在循环内部删除某些东西。如果您想更改当前列表,则必须首先将元素保存到循环中,然后在循环外部使用remove(element)removeAll(elements)从集合中删除它们(当然还可以使用removeAt(index))。 - Johann Kexel
1
好的,您可以删除一个项目。 - Kasım Özdemir
1
如果你只想删除一个元素,那么你肯定可以做到这一点。 - Johann Kexel
@JohannKexel 是的 - Animesh Sahu
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接