3 回答
TA贡献1725条经验 获得超7个赞
如果位置不重要,而您使用Set
它,那么这将变得非常微不足道:
set1.retainAll(set2); set1.retainAll(set3);
使用流你可以这样做:
set1.stream() .filter(set2::contains) .filter(set3::contains) .collect(Collectors.toList());
TA贡献1864条经验 获得超2个赞
你可以这样做:
Set<Integer> set1 = new HashSet<>(list1); IntStream.range(0, Math.min(list2.size(), list3.size())) .filter(i -> Objects.equals(list2.get(i), list3.get(i))) // check where index have the same value .mapToObj(list2::get) // get the value (as the values are equal could be also list3) .filter(set1::contains) // check if list1 contains the value .forEach(System.out::println);
输出
3
转换list1
为集合 ( set1
) 通过提高包含查询 ( ) 的性能,可以显着提高速度O(n) -> O(1)
。
TA贡献1752条经验 获得超4个赞
由于第一个元素的索引List并不重要,因此您可以Stream遍历元素list1并搜索同时list1出现在同一索引处的元素:list2list3
Optional<Integer> result =
list1.stream()
.filter(IntStream.range(0,list2.size())
.filter(i -> list2.get(i).equals(list3.get(i)))
.mapToObj(list2::get)
.collect(Collectors.toSet())::contains)
.findFirst();
或者,如果您只想打印第一个匹配项:
list1.stream()
.filter(IntStream.range(0,list2.size())
.filter(i -> list2.get(i).equals(list3.get(i)))
.mapToObj(list2::get)
.collect(Collectors.toSet())::contains)
.limit(1)
.forEach(System.out::println);
管道IntStream生成同时出现在同一索引中Set的所有元素。搜索that的元素属于 that 。list2list3filterlist1Set
添加回答
举报