我可以根据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){
}
答案 0 :(得分:10)
首先,您应该将这些列表中的一个或另一个转换为Set
,以便.contains()
检查有效。在.contains()
上调用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);
原则上,您所描述的是set operations。 &#34;重叠&#34; ID是两组ID的交集,而&#34;缺少&#34; ID是差异。
Guava在Sets
实用程序中提供了这些操作的高效实现。 (union
,intersection
,difference
和complementOf
)。
答案 1 :(得分:5)
您可以使用filter API in java 8 Stream来执行此操作。如下面的代码片段:
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));
}
}
会给你结果:
00123
003456
023299