我可以根据java 8中另一个数组列表中的元素过滤数组列表吗?整个故事是我从oracle电子商务套件应用程序中获取了活跃员工的列表
**EmpID**
00123
003456
023299
Run Code Online (Sandbox Code Playgroud)
我有一个单独的文件,其中包含文件名为EmpID.jpeg的照片
**FileName**
00123.jpeg
003456.jpeg
023299.jpeg
Run Code Online (Sandbox Code Playgroud)
现在我的目的是比较列表,过滤提供我照片的员工和他们没有给我的照片.
private ArrayList<String> _IDsFromFile;
private ArrayList<String> _IDsFromImage;
---
---
public void compareAndCopy(String fileName){
}
Run Code Online (Sandbox Code Playgroud)
dim*_*414 13
首先,您应该将这些列表中的一个或另一个转换为a Set,以便.contains()检查有效.调用.contains()a List是线性时间操作,意味着这样做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);
Run Code Online (Sandbox Code Playgroud)
原则上,您所描述的是设定操作."重叠"ID是两组ID的交集,而"缺失"ID是差异.
Guava在其实用程序中提供了这些操作的高效实现Sets.(union,intersection,difference,和complementOf).
您可以在java 8 Stream中使用过滤器API来执行此操作.如下面的代码片段:
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
/**
* @author Shizhz
*/
public class Main {
private static Set<String> _IDsFromFile;
private static Set<String> _IDsFromImage;
static {
_IDsFromFile = new HashSet();
_IDsFromFile.add("00123");
_IDsFromFile.add("003456");
_IDsFromFile.add("023299");
_IDsFromFile.add("023300");
_IDsFromImage = new HashSet<>();
_IDsFromImage.add("00123.jpeg");
_IDsFromImage.add("003456.jpeg");
_IDsFromImage.add("023299.jpeg");
}
private static Set<String> filterEmployeesWithPhones(Set<String> employeeSet, Set<String> photoSet) {
return employeeSet.stream().filter(empId -> photoSet.contains(empId + ".jpeg")).collect(Collectors.toSet());
}
public static void main(String[] args) {
filterEmployeesWithPhones(_IDsFromFile, _IDsFromImage).forEach(emp -> System.out.println(emp));
}
}
Run Code Online (Sandbox Code Playgroud)
会给你结果:
00123
003456
023299