当前位置: 首页 > 知识库问答 >
问题:

Java 8 流如何过滤在另一个数组列表中找不到的列表的内容?

陆敏学
2023-03-14

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

}

共有2个答案

陈晟睿
2023-03-14

您可以使用java 8 Stream中的filter 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));
    }
}

会给你结果:

00123

003456

023299

曾光远
2023-03-14

首先,您应该将这些列表中的一个或另一个转换为Set,以便。contains()检查是有效的。正在调用。<code>列表</code>上的contains()</code<是一个线性时间运算,这意味着这样做n次是二次的。

完成此操作后,可以直接使用。过滤器()甚至。分区通过()来确定两个列表重叠的位置。

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);

原则上,您所描述的是设置操作。“重叠”ID是两组ID的交集,而“缺失”ID是差异。

Guava在其Sets实用程序中提供了这些操作的有效实现。(联合交集差异互补)。

 类似资料:
  • 问题内容: 我在此论坛和Google中搜索后发布了查询,但无法解决相同的问题。 我正在尝试根据列表1中的值过滤列表2(多列)。 码 在上面的代码中,如果我提供特定值,则可以过滤,但不确定如何检查列表2中的Car Name是否在列表1中退出。 希望我面对的问题很清楚,等待指导(对于Java来说还是比较新的,因此,如果上述查询非常基础,请原谅)。 编辑, 我相信上面提供的链接3应该可以解决,但就我而言

  • 问题内容: 我必须找到一种最好的方法来找出第二个arraylist中未显示的元素。假设 因此,基本上我想要找出的是 a 在 数组列表b中 不存在的元素。 那么什么是最好的解决方案呢? 问题答案: 还可以考虑使用集合而不是列表。

  • 我在数组列表(嵌套数组列表)中有一个数组列表,如下所示 现在我需要获取存在于arraylist的给定索引中的的实例并为其添加一个值。我使用了以下代码 但是它给了我一个错误 线程"main"java.lang.异常索引:0,大小:0 如何解决这个问题以及为什么会发生这种情况。 谢谢你

  • 很抱歉这太模糊了,但代码太多了。 这是一个五卡梭哈游戏。基本上,我试图将对象添加到另一个数组列表中的数组列表中。 这是我创建玩家数组并将手类中的数组添加到其中的地方,至少我认为这就是正在发生的事情: 稍后,我尝试在循环交易中将牌添加到玩家阵列中的手牌阵列中。由于有五张牌,第一个循环进行了五次。第二个是玩家数组的长度(玩家总数),每次应该添加一张卡。 Deck类中有一个deal方法,由以下方法初始化

  • 我有一个物体,如下所示 给定MyObject的列表,是否可以使用Java8个流来过滤类型和子类型? 目前为止我有 但在这一部分中,我还希望在每个子类型上使用另一个过滤器来过滤特定子类型上的过滤器。我想不出怎么做。 例如 我会传入匹配类型B和子类型Z,所以我希望得到一个结果- 以下当前返回列表中的2个项目。 但是我想在每个子类型上添加一个额外的过滤器,并且只匹配“Z”存在的地方。

  • 问题内容: 包含(和)中也存在的两个元素。 有没有一种干净的方法来确保其中不包含这些元素或其中可能已经存在的任何其他重叠元素? 问题答案: 这将使您只包含。