gpt4 book ai didi

java - Collection.removeIf 工作异常

转载 作者:行者123 更新时间:2023-11-30 07:57:42 24 4
gpt4 key购买 nike

我有来自文件的行的 ArrayList。文件包含带有 5 个数字的行:

1 1 13 25 25
25 25 11 3 1
25 25 13 1 1

而且我有函数 test(String) 来测试我是否需要这一行或者我是否必须将它从列表中删除。我的测试方法:

static boolean test(String s){
return list.contains(reverse(s));
}

reverse(String) 返回以相反顺序书写的数字行。对于 1 1 13 25 25,它将返回 25 25 13 1 1

因此,我编写了使用 Iterator 循环遍历列表并删除元素的代码。

Iterator<String> iter = list.iterator();
while(iter.hasNext()){
if(test(iter.next()))
iter.remove();
}

这段代码工作正常。但是 IDEA 说循环可以用 Collection.removeIf 调用代替。所以,我尝试用这一行替换上面的代码:

list.removeIf(s->test(s));

但它给了我空列表。为什么?有什么区别?

我还尝试使用 removeIf 删除包含某些字符的行,它工作正常。在这里您可以看到所有程序:http://pastebin.com/bWw3cBXg .

我的文件 http://pastebin.com/mEb5sBBJ (~17000 行)

最佳答案

您在修改列表的同时遍历列表(通过对其调用 contains()),这通常不是一个好主意。

您的第一个算法测试第一行是否包含在列表中。它删除了那条线。然后它检查第二行(现在是第一行),但没有找到反向行元素,因为第一行已经被删除。

第二种算法不同:它遍历列表并标记所有必须删除的索引。然后它会删除所有这些。第二行和第一行颠倒过来一样。第三个也一样。所以最后,一切都反过来了。

虽然 removeIf 中没有记录这种行为,但它符合谓词应该是幂等的一般约定,而这里不是这种情况。对列表的元素调用谓词不会返回相同的值,具体取决于您是否已经删除了列表的另一个元素。

关于java - Collection.removeIf 工作异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40974247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com