迭代两个列表并在 Kotlin 中删除条件值

Iterating over two lists and removing a value on condition in Kotlin

我有一个时间段列表,每个时间段为一个小时,还有一个存储在 Firestore 中的同一天的时间段预订列表。我现在需要向用户显示空闲插槽的可用性。所以我是 运行 下面的代码。如果一天只有一个时段并且已被预订,则可以正常工作。但是,如果一天中有更多插槽并且其中一个已被预订,它会因索引越界错误而崩溃。在这个尝试过的迭代器上花费了多个小时,但不知道为什么会这样。请问有什么解决办法吗?

请注意:我已查看以下内容 link,但对我的情况无效:

Iterating through a Collection, avoiding ConcurrentModificationException when removing objects in a loop

 val existingBookingsList: List<Booking> = it.toObjects(Booking::class.java)

            val newAvailableList: MutableList<String> = listOfAvailableSlots

            for (booking in existingBookingsList) {
                //change availability of the time slots
                val endTimeOfAppointment = createTime(booking.getstartTime()!!)
                //add duration to time stored in Minutes
                servDuration = booking.getduration()!!.toInt()
                if (servDuration == 0) {
                    durhrs = 0
                    durmins = 0
                } else if (servDuration < 60) {
                    durmins = servDuration
                    durhrs = 0
                } else {
                    val hrs: Int = servDuration / 60
                    val mins = servDuration - (hrs * 60)
                    durhrs = hrs
                    durmins = mins
                }
                endTimeOfAppointment.add(Calendar.HOUR_OF_DAY, durhrs)
                endTimeOfAppointment.add(Calendar.MINUTE, durmins)

//以上是获取已为特定日期预订的每个时段的结束时间

//下面是在可以预订的时段上循环结束时间,以识别和删除重叠

//这一行出现错误 val hour = listOfAvailableSlots[j] - Index out of bounds index 2 and size is 1

                for (j in 0 until listOfAvailableSlots.size) {
                    val hour = listOfAvailableSlots[j]
                    val endTime = createTime(hour)
                    if (endTimeOfAppointment.compareTo(endTime) >= 0) {
                        newAvailableList.removeAt(j)
                    }
                }

            }

代码中有几个问题。

在第 val newAvailableList: MutableList<String> = listOfAvailableSlots 行,您没有初始化包含 listOfAvailableSlots 值的新列表。您正在将 listOfAvailableSlots 的指针分配给 newAvailableList,因此您对 newAvailableList 执行的每个操作都会反映到 listOfAvailableSlots。将列表复制到另一个变量的最简单方法是使用 .toMutableList()。即使源列表已经可变,它也能工作。 val newAvailableList: MutableList<String> = listOfAvailableSlots.toMutableList()

下面的代码可以修改

for (j in 0 until listOfAvailableSlots.size) {
    val hour = listOfAvailableSlots[j]
    val endTime = createTime(hour)
    if (endTimeOfAppointment.compareTo(endTime) >= 0) {
        newAvailableList.removeAt(j)
    }
}

至此

for(availableSlot in listOfAvailableSlot) {
    val endTime = createTime(availableSlot)
    if(endTimeOfAppointment.compareTo(endTime) >= 0) {    //consider to use greaterThan or lessThan
        newAvailableList.remove(availableSlot)
    }
}

比之前的更安全

同样的方法你可以使用过滤功能:

newAvailableList.filter { endTimeOfAppointment.compareTo(createTime(it) >= 0) }

尝试清理您的代码,如果您解决了问题,请告诉我们