Java 我如何在一个目录中筛选列表?

Java 我如何在一个目录中筛选列表?,java,list,filter,java-8,Java,List,Filter,Java 8,我最近有这个问题。 这是我的密码 for(int i=1; i<=repeticiones;i++){ posiblesComunes.removeIf(p->!periodos.get(i).contains(p)); } 我需要的是“1-1-16”,一个共同点 编辑2: periodosComunes示例(用于for循环): 这个怎么样: Set<String> periodosComunes = Set.of("1-1-16","6-2-16"); Lis

我最近有这个问题。 这是我的密码

for(int i=1; i<=repeticiones;i++){
    posiblesComunes.removeIf(p->!periodos.get(i).contains(p));
}
我需要的是“1-1-16”,一个共同点

编辑2:

periodosComunes示例(用于for循环):

这个怎么样:

Set<String> periodosComunes = Set.of("1-1-16","6-2-16");
List<Set<String>> periodos = List.of(
  Set.of("1-1-16","6-12-16"),
  Set.of("1-1-16","2-8-15"),
  Set.of("3-7-08","1-1-16")
);

List<String> result = periodosComunes.stream()
  .filter(x -> periodos.stream()
      .allMatch(y -> y.contains(x))
  )
  .collect(Collectors.toList());

// result = [1-1-16]
Set periodosComunes=Set.of(“1-1-16”、“6-2-16”);
List periodos=List.of(
第1-1-16条、第6-12-16条、,
第1-1-16条、第2-8-15条、,
第三组(“3-7-08”、“1-1-16”)
);
列表结果=periodosComunes.stream()
.filter(x->periodos.stream()
.allMatch(y->y.contains(x))
)
.collect(Collectors.toList());
//结果=[1-1-16]
我使用Java 9中的集合文本来节省一些输入,但这与解决方案无关。

这个如何:

Set<String> periodosComunes = Set.of("1-1-16","6-2-16");
List<Set<String>> periodos = List.of(
  Set.of("1-1-16","6-12-16"),
  Set.of("1-1-16","2-8-15"),
  Set.of("3-7-08","1-1-16")
);

List<String> result = periodosComunes.stream()
  .filter(x -> periodos.stream()
      .allMatch(y -> y.contains(x))
  )
  .collect(Collectors.toList());

// result = [1-1-16]
Set periodosComunes=Set.of(“1-1-16”、“6-2-16”);
List periodos=List.of(
第1-1-16条、第6-12-16条、,
第1-1-16条、第2-8-15条、,
第三组(“3-7-08”、“1-1-16”)
);
列表结果=periodosComunes.stream()
.filter(x->periodos.stream()
.allMatch(y->y.contains(x))
)
.collect(Collectors.toList());
//结果=[1-1-16]

我使用Java 9中的集合文本来节省一些输入,但这与解决方案无关。

并非所有列表都提供迭代器删除其项的能力;但是,如果您选择了正确的列表类型,它将内置到
迭代器
界面中

Iterator i = list.iterator();
while (i.hasNext()) {
    if (i.next().equals(bad)) {
        i.remove();
    }
}

解决方案的简单性就足够了,您可以考虑跳过基于流的方法,并且不同于某些类型的修改,<代码> Iterator < /代码>移除将不会抛出<代码> CONTRONMONTIOFIGATION异常< /代码> .< /P> < P>并不是所有列表都提供迭代器具有删除其项的能力;但是,如果您选择了正确的列表类型,它将内置到

迭代器
界面中

Iterator i = list.iterator();
while (i.hasNext()) {
    if (i.next().equals(bad)) {
        i.remove();
    }
}

解决方案的简单性就足够了,您可以考虑跳过基于流的方法,不同于某些类型的修改,<代码> Iterator < /代码>删除不会抛出<代码> CONTRONMONTIVICIONECTUCTION<代码> .P>您不能从lambda表达式中访问本地变量<代码>代码< i>代码>因为它在循环过程中会被修改。最简单的修复方法是在另一个不可变变量中捕获

i
的当前值:

for(int i=1; i<=repeticiones;i++) {
    int finalI = i;
    posiblesComunes.removeIf(p -> !periodos.get(finalI).contains(p));
}
for(inti=1;i!periodos.get(finalI.contains)(p));
}
请注意,for each循环的变量没有此问题:

for(Set<String> set: periodos.subList(1, repeticiones))
    posiblesComunes.removeIf(p -> !set.contains(p));
for(集合:周期子列表(1,重复))
posiblesComunes.removeIf(p->!set.contains(p));
但最终,您在这里过度使用了Java8特性。从Java 2开始,可以使用原始集合API执行此操作:

for(Set<String> set: periodos.subList(1, repeticiones))
    posiblesComunes.retainAll(set);
for(集合:周期子列表(1,重复))
可保留的(套);
这也适用于原始循环:

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

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

for(int i=1; i<=repeticiones;i++) {
    int finalI = i;
    posiblesComunes.removeIf(p -> !periodos.get(finalI).contains(p));
}
for(inti=1;i!periodos.get(finalI.contains)(p));
}
请注意,for each循环的变量没有此问题:

for(Set<String> set: periodos.subList(1, repeticiones))
    posiblesComunes.removeIf(p -> !set.contains(p));
for(集合:周期子列表(1,重复))
posiblesComunes.removeIf(p->!set.contains(p));
但最终,您在这里过度使用了Java 8功能。此操作可以使用Java 2之后的原始集合API完成:

for(Set<String> set: periodos.subList(1, repeticiones))
    posiblesComunes.retainAll(set);
for(集合:周期子列表(1,重复))
可保留的(套);
这也适用于原始循环:

for(int i=1; i<=repeticiones; i++)
    posiblesComunes.retainAll(periodos.get(i));
for(inti=1;i)应该有效(如果我很了解您的需求):

这应该行得通(如果我很了解您的需求):



与其指定集合的类型,不如提供集合的定义。您可以使用临时变量:
final int\u i=i;
,也可以只执行
periodos.forEach(posiblesComunes::retainal)
@shmosel我以前看不到这个问题的选项。你能再解释一下retainal是如何工作的吗?可能是因为
posiblesComunes
是不可修改的。与其指定集合的类型,不如提供集合的定义。你可以使用一个临时变量:
final int\u i=i;
Or您可能只需要执行
periodos.forEach(posiblesComunes::retainal);
@shmosel我以前没有看到这个问题的选项。您能解释一下retainal是如何工作的吗?可能是因为
posiblesComunes
是不可修改的。它很“简单”因为您方便地忽略了
坏的
来自何处。Stream或no Stream,只要您展平另一个列表,您就会得到我建议的结果。更不用说不变性等了。@AbhijitSarkar bad是包含您筛选出的值的对象。实际上,您可以将任何内容放入条件中,然后
I.remove()
会起作用。如果一个人不知道如何确定他们想要删除什么,那么这是一个更大的问题,不能用代码来解决。我理解你的代码中有什么不好的地方。我质疑使用
迭代器
比使用
更简单或更好的说法,主要是因为现在是2017年。@AbhijitSarkar您提供的简单解决方案是六行代码,其中一行在起始列表上方至少有一个生产者、一个平面图和一个收集器。我的有一个迭代器。这是一个类vs 3,您甚至不需要完全了解流式语义的最新信息。如果这不简单,那是什么?2017年,现在我们需要在拿到驾照之前,我必须先接受培训、考试和保险。我奶奶的驾照上有我的签名,而且她从来没有开过车。更新的并不总是简单:)。你遗漏了很多要点。1.你的代码不可编译。如果你让它编译,我们将看到你节省了多少行。2.行数减少并不意味着简单;我可以