当前位置: 首页 > 面试题库 >

1个列表的流过滤器基于另一个列表

唐宇定
2023-03-14
问题内容

我在此论坛和Google中搜索后发布了查询,但无法解决相同的问题。

我正在尝试根据列表1中的值过滤列表2(多列)。

List1:
 - [Datsun]
 - [Volvo]
 - [BMW]
 - [Mercedes]

List2: 
 - [1-Jun-1995, Audi, 25.3, 500.4, 300]
 - [7-Apr-1996, BMW, 35.3, 250.2, 500]
 - [3-May-1996, Porsche, 45.3, 750.8, 200]
 - [2-Nov-1998, Volvo, 75.3, 150.2, 100]
 - [7-Dec-1999, BMW, 95.3, 850.2, 900]

expected o/p:
 - [7-Apr-1996, BMW, 35.3, 250.2, 500]
 - [2-Nov-1998, Volvo, 75.3, 150.2, 100]
 - [7-Dec-1999, BMW, 95.3, 850.2, 900]

// List 1 in above eg
List<dataCarName> listCarName = new ArrayList<>(); 
// List 2 in above eg
List<dataCar> listCar = new ArrayList<>();

// Values to the 2 lists are populated from excel

List<dataCar> listOutput = listCar.stream().filter(e -> e.getName().contains("BMW")).collect(Collectors.toList());

在上面的代码中,如果我提供特定值,则可以过滤,但不确定如何检查列表2中的Car Name是否在列表1中退出。

希望我面对的问题很清楚,等待指导(对于Java来说还是比较新的,因此,如果上述查询非常基础,请原谅)。

编辑,
我相信上面提供的链接3应该可以解决,但就我而言,它不起作用。也许是因为list-1中的值填充为org.gradle04.Main.Cars.dataCarName@4148db48..等。仅当我通过调用getName在List 1上执行forEach时,才能以人类可读的格式获取该值方法。


问题答案:

目前尚不清楚为什么您要List<DataCarName>首先使用而不是List/Set<String>

您必须提供的谓词必须检查相应数据汽车实例的名称是否在列表中。

e -> e.getName().contains("BMW")只会检查数据车的名称是否包含您所不想要的宝马。您的第一次尝试可能是

e -> listCarName.contains(e.getName())

但由于listCarNameList<DataCarName>和,e.getName()所以我将得到一个空列表。

您的第一个选择是更改谓词,以便从数据汽车名称列表中获取流,将它们映射到其字符串表示形式,并检查这些名称中的任何一个是否与您当前正在过滤的当前数据汽车实例的名称相对应:

List<DataCar> listOutput =
    listCar.stream()
           .filter(e -> listCarName.stream().map(DataCarName::getName).anyMatch(name -> name.equals(e.getName())))
           .collect(Collectors.toList());

现在这非常昂贵,因为您需要为数据车流管道中的每个实例创建一个流。更好的方法是先建立一个Set<String>带有汽车名称的,然后简单地contains用作此集合的谓词:

Set<String> carNames = 
    listCarName.stream()
               .map(DataCarName::getName)
               .collect(Collectors.toSet());

List<DataCar> listOutput =
     listCar.stream()
            .filter(e -> carNames.contains(e.getName()))
            .collect(Collectors.toList());


 类似资料:
  • 我有一个类似这样的组对象 和如下所示的Item对象

  • 我试图建立一个专栏,将根据另一个。新列应反映满足某些标准的值,并在值不符合标准的地方放置0。 例如,名为银行余额的列将有负值和正值;新列透支将为相应行提供负值,余额大于0时为0。 最终结果应该是这样的。

  • 我有两个具有相同列的表,这些表没有唯一的列。假设列为Col1、Col2、Col3和Col4。表是T1和T2。 我要做的是插入从T2到T1的所有行,其中Col1 比如Col1=“APPLE”和Col2=“2019”。如果一行在T2中包含Col1=“APPLE”和Col2=2019,我不想将其插入T1,而如果一行包含Col1=“APPLE”和Col2=2020,我想将其插入T1。 我正在努力找到最简单

  • 我可以根据在java 8中的另一个数组列表中找到的元素过滤数组列表吗?整个故事是我从Oracle电子商务套件应用程序中获取了活动员工列表 我有一个单独的文件,其中包含文件名为EmpID.jpeg的照片 现在,我的目的是比较这些列表,并筛选那些向我提供照片的员工和那些没有给我的员工。

  • 问题内容: 我有一个表,其中包含商店中每件商品的单价和其他详细信息。 另一个包含每个订单中包含的项目的详细信息。 现在我要计算 请注意,我希望它成为表本身的一部分,而不是作为其他视图或查询。我怎样才能做到这一点?我为此研究了触发器和其他机制,但是它们是否适用于不同表中的值,尤其是在存在此类约束的情况下? 我尝试过根据另一列计算出的Column进行以下触发吗?: 但这似乎没有用 问题答案: 这是如何

  • 我有两个数据框 > < li> 一个数据帧中的最大日期列::一列,一行- df1,列:最大日期 具有日期列:: df2列的多条记录:col1, col2, col3… colDate 我想要过滤器 df2 基于 df1.maxdate,