gpt4 book ai didi

java - 如何过滤 for 中的列表?

转载 作者:行者123 更新时间:2023-12-01 07:48:05 25 4
gpt4 key购买 nike

我最近遇到了这个问题。这是我的代码

for(int i=1; i<=repeticiones;i++){
posiblesComunes.removeIf(p->!periodos.get(i).contains(p));
}

periodos 是一个 List(Set(String)),posiblesComunes 是一个 Set(String)

我需要做的是只获取 periodos 中所有 Set(String) 中的字符串。我尝试使用 for 来做到这一点,但我收到下一条消息:

Local variable i defined in an enclosing scope must be final or effectively final

有什么办法可以解决这个问题吗?或者另一种获取这些元素的方法?谢谢!

编辑:只是一个例子

periodos = {("1-1-16","6-12-16"),("1-1-16","2-8-15"),("3-7-08","1-1-16")}

我需要得到的是“1-1-16”,这是共同的。

编辑2:

periodosComunes 示例(for 循环):

periodosComunes = ("1-1-16","6-2-16")

最佳答案

您无法从 lambda 表达式访问局部变量 i,因为它在循环期间会被修改。最简单的修复方法是在另一个不可变变量中捕获 i 的当前值:

for(int i=1; i<=repeticiones;i++) {
int finalI = i;
posiblesComunes.removeIf(p -> !periodos.get(finalI).contains(p));
}

请注意,for-each循环的变量没有这个问题:

for(Set<String> set: periodos.subList(1, repeticiones))
posiblesComunes.removeIf(p -> !set.contains(p));

但最终,您在这里过度使用了 Java 8 功能。此操作可以使用 Java 2 以来的原始 Collections API 来完成:

for(Set<String> set: periodos.subList(1, repeticiones))
posiblesComunes.retainAll(set);

这也适用于您的原始循环:

for(int i=1; i<=repeticiones; i++)
posiblesComunes.retainAll(periodos.get(i));

这里,你还可以添加一个快捷方式,因为集合永远不会增长,所以如果没有公共(public)元素,一旦集合变空就可以停止

for(int i=1; i<=repeticiones && !posiblesComunes.isEmpty(); i++)
posiblesComunes.retainAll(periodos.get(i));

关于java - 如何过滤 for 中的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45535668/

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