Java 8流如何过滤另一个arrayList中找不到的List的内容?

Cli*_* Wg 3 java java-8

我可以根据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).


shi*_*zhz 5

您可以在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

  • 由于列表确定元素成员资格的O(n)时间,这或多或少是正确的,但不是高效的.如果你可以使用`Set`s,那么它会变得疯狂. (2认同)