Java 基于另一个列表的1个列表的流过滤器
我在这个论坛和谷歌搜索后发布了我的查询,但无法解决同样的问题。 例如: 我试图根据列表1中的值筛选列表2(多列)Java 基于另一个列表的1个列表的流过滤器,java,arraylist,java-8,java-stream,Java,Arraylist,Java 8,Java Stream,我在这个论坛和谷歌搜索后发布了我的查询,但无法解决同样的问题。 例如: 我试图根据列表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
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]
代码
//以上示例中的列表1
List listCarName=新建ArrayList();
//在上面的示例中列出2
List listCar=new ArrayList();
//从excel中填充两个列表的值
List listOutput=listCar.stream().filter(e->e.getName().contains(“BMW”).collect(Collectors.toList());
在上面的代码中,如果我提供了一个特定的值,我可以进行筛选,但不确定如何检查列表2中的车名是否存在于列表1中
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]
希望我面临的问题是清楚的,等待指导(我对Java还是比较新的,因此如果上面的查询非常基本,请原谅)
编辑
我相信上面提供的link-3应该可以解决问题,但在我的情况下,它不起作用。可能是因为列表1中的值填充为
org.gradle04.Main.Cars。dataCarName@4148db48 .. 等
只有在调用getName方法对列表1执行forEach操作时,我才能以人类可读的格式获取值。不清楚为什么您首先使用的是
列表
,而不是列表/集
您必须提供的谓词必须检查对应的data car实例是否在列表中有其名称
e->e.getName().contains(“BMW”)
将只检查数据车的名称是否包含您不想要的BMW。你的第一次尝试可能是
e -> listCarName.contains(e.getName())
但是由于listCarName
是一个List
和e.getName()
一个字符串(我猜),因此您将得到一个空列表
您拥有的第一个选项是更改谓词,以便从数据车名称列表中获取流,将它们映射到它们的字符串表示形式,并检查其中任何名称是否与您当前筛选的当前数据车实例的名称相对应:
List<DataCar> listOutput =
listCar.stream()
.filter(e -> listCarName.stream().map(DataCarName::getName).anyMatch(name -> name.equals(e.getName())))
.collect(Collectors.toList());
现在还不清楚为什么您首先要使用
列表
,而不是列表/集合
您必须提供的谓词必须检查对应的data car实例是否在列表中有其名称
e->e.getName().contains(“BMW”)
将只检查数据车的名称是否包含您不想要的BMW。你的第一次尝试可能是
e -> listCarName.contains(e.getName())
但是由于listCarName
是一个List
和e.getName()
一个字符串(我猜),因此您将得到一个空列表
您拥有的第一个选项是更改谓词,以便从数据车名称列表中获取流,将它们映射到它们的字符串表示形式,并检查其中任何名称是否与您当前筛选的当前数据车实例的名称相对应:
List<DataCar> listOutput =
listCar.stream()
.filter(e -> listCarName.stream().map(DataCarName::getName).anyMatch(name -> name.equals(e.getName())))
.collect(Collectors.toList());
在DataCar类型中,
getName()
是否返回字符串或DataCarName枚举类型?如果是枚举,您可能会遵循Alexis C的方法,但不是使用Collectors.toSet()构建哈希集,而是构建一个枚举集,这样可以提供O(1)性能。修改Alexis的建议,结果如下:
Set<DataCarName> carNames =
listCarName.stream()
.collect(Collectors.toCollection(
()-> EnumSet.noneOf(DataCarName.class)));
List<DataCar> listOutput =
listCar.stream()
.filter(car -> carNames.contains(car.getName()))
.collect(Collectors.toList());
Set carNames=
listCarName.stream()
.collect(收集器(
()->EnumSet.noneOf(DataCarName.class));
列表输出=
listCar.stream()
.filter(car->carNames.contains(car.getName()))
.collect(Collectors.toList());
在DataCar类型中,getName()
是否返回字符串或DataCarName枚举类型?如果是枚举,您可能会遵循Alexis C的方法,但不是使用Collectors.toSet()构建哈希集,而是构建一个枚举集,这样可以提供O(1)性能。修改Alexis的建议,结果如下:
Set<DataCarName> carNames =
listCarName.stream()
.collect(Collectors.toCollection(
()-> EnumSet.noneOf(DataCarName.class)));
List<DataCar> listOutput =
listCar.stream()
.filter(car -> carNames.contains(car.getName()))
.collect(Collectors.toList());
Set carNames=
listCarName.stream()
.collect(收集器(
()->EnumSet.noneOf(DataCarName.class));
列表输出=
listCar.stream()
.filter(car->carNames.contains(car.getName()))
.collect(Collectors.toList());
您是在寻找精确匹配,还是汽车名称包含第二个列表中某辆汽车的类型就足够了?(正如您使用contains
而不是equals
).filter(e->listcaname.contains(e.getName())
?您链接的第三个问题显示了如何实现您的目标:@AlexisC。我在那个线程中遵循了解决方案,但没有为我工作。我猜这是因为列表1中的值存储为例如:org.gradle04.Main.Cars。dataCarName@4148db48为了获得一种人类可读的格式,我必须通过调用getName方法来进行forEach。但我无法将其纳入筛选标准。对我应该如何进行有什么建议吗?如果我的查询非常基本,请提前感谢并道歉。@i在这种情况下,您可以先将列表
转换为集
,然后在过滤器中使用包含
。您是在寻找精确匹配,还是车名包含第二个列表中某辆车的类型就足够了?(正如您使用contains
而不是equals
).filter(e->listcaname.contains(e.getName())
?您链接的第三个问题显示了如何实现您的目标:@AlexisC。我在那个线程中遵循了解决方案,但没有为我工作。我猜这是因为列表1中的值存储为例如:org.gradle04.Main.Cars。dataCarName@4148db48为了获得一种人类可读的格式,我必须通过调用getName方法来进行forEach。但我无法将其纳入筛选标准。对我应该如何进行有什么建议吗?如果我的查询非常基本,请提前感谢并表示歉意。@I在这种情况下,您可以做的是首先将列表
转换为集合
,然后在过滤器中使用包含
。感谢您的时间和真诚的感谢