我可以根据在 Java 8 中的另一个数组列表中找到的元素来过滤数组列表吗?整个故事是我从 oracle 电子商务套件应用程序中获取了活跃员工的列表
**EmpID**
00123
003456
023299
我有一个单独的文件,其中包含文件名为 EmpID.jpeg
的照片**FileName**
00123.jpeg
003456.jpeg
023299.jpeg
现在我的目的是比较列表并过滤向我提供照片和未提供照片的员工。
private ArrayList<String> _IDsFromFile;
private ArrayList<String> _IDsFromImage;
---
---
public void compareAndCopy(String fileName){
}
最佳答案
首先,您应该将这些列表中的一个或另一个转换为 Set
,所以 .contains()
检查是有效的。在 List
上调用 .contains()
是线性时间操作,这意味着这样做 n 次是二次的。
一旦完成,就可以直接使用 .filter()
甚至 .partitioningBy()
以确定两个列表重叠的位置。
Set<String> imageIdsSet = new HashSet<>(IDsFromImage);
List<String> overlappingIds = IDsFromFile.stream()
.filter(imageIdsSet::contains)
.collect(toList());
// OR
Map<Boolean, List<String>> partitionedIds = IDsFromFile.stream()
.collect(partitioningBy(imageIdsSet::contains));
List<String> overlappingIds = partitionedIds.get(true);
List<String> missingIds = partitionedIds.get(false);
原则上,您所描述的是 set operations . “重叠”ID 是两组 ID 的交集,而“缺失”ID 是差异。
Guava在其 Sets
中提供了这些操作的有效实现效用。 ( union
、 intersection
、 difference
和 complementOf
)。
关于Java 8 流如何过滤在另一个 arrayList 中找不到的列表的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42730691/