迭代两个列表并在 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) }
尝试清理您的代码,如果您解决了问题,请告诉我们
我有一个时间段列表,每个时间段为一个小时,还有一个存储在 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) }
尝试清理您的代码,如果您解决了问题,请告诉我们