如果条件取决于迭代器所基于的对象的属性,如何从迭代器中删除元素?

03k*_*kim 1 iteration iterator kotlin

让我详细说明一下:

我需要能够迭代对象列表。每个对象都有一个列表属性,我必须检查该列表是否包含其他列表中不存在的元素。

当我尝试使用嵌套 for 循环来做到这一点时,它不断给我并发修改异常,所以我尝试使用迭代器,但现在我陷入困境,因为如果我基于对象列表创建一个迭代器,我可以不访问单个对象的属性然后进行迭代。

这是我试图完成的一些示例代码:

for (preference in preferencesWithRestaurant) {
    for (restaurantID in preference.restaurantIDs) {
        // One method I tried using
        preferencesWithRestaurant.removeIf{ !listOfIds.contains(restaurantID) }

        /* alternate method I tried using
        if (!listOfIds.contains(restaurantID)) {
            preferencesWithRestaurant.remove(preference)
        }
        */

    }
}
Run Code Online (Sandbox Code Playgroud)

bro*_*oot 5

如果您可以替换值preferencesWithRestaurant或将结果存储在另一个变量中,那么您可以过滤它

preferencesWithRestaurant = preferencesWithRestaurant.filter { preference ->
    preference.restaurantIDs.all { it in listOfIds }
}
Run Code Online (Sandbox Code Playgroud)

根据您的确切类型,preferencesWithRestaurant您可能需要将其转换为正确的类型,例如toMutableList()在最后调用。

preferencesWithRestaurant如果您喜欢就地修改,那么您可以使用retainAll()(感谢@Tenfour04):

preferencesWithRestaurant.retainAll { preference ->
    preference.restaurantIDs.all { it in listOfIds }
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以保留原始方法,但使用可变迭代器在迭代时删除项目:

val iter = preferencesWithRestaurant.listIterator()
for (preference in iter) {
    for (restaurantID in preference.restaurantIDs) {
        if (!listOfIds.contains(restaurantID)) {
            iter.remove()
            break
        }
    }
}
Run Code Online (Sandbox Code Playgroud)