我试图根据另一个列表中的值筛选一个列表。我经历过其他类似的问题,并试图用它来达到我的目标,但我无法做到这一点。
列表1由类CarModel
(L1)的对象组成。
public class CarModel {
private String year;
private String model;
}
列表2由类CarData
(L2)的对象组成。
public class CarData {
private OffsetDateTime date;
private List<CarDetails> carDetails;
}
public class CarDetails {
private String owner;
private List<Cars> cars = null;
}
public class Car {
private String modelName;
private String dealership;
}
我试图实现的是基于Car.modelName
of list1
与CarModel.model
of list2
匹配的过滤list1
。
例如:
清单1由3个对象组成:
carModel1 = { year: 2019, model: BMW-500-7S-150-Z100 }
carModel2 = { year: 2019, model: MERCEDES-700-7S-350-Z100 }
carModel3 = { year: 2018, model: AUDI-100-Q6-350-Z100 }
列表2包含以下对象:
CarData = {
date: 2-6-2021,
carDetails: [
{
owner: John,
cars: [ {
modelName: BMW-500-7S-*-Z100,
dealership: Nevada
},
{
modelName:MERCEDES-700-7S-*-Z100,
dealership: Daytona
}
]
}
]
}
因此,列表1不包含c3
,因为该模型与CarData
中的modelName
不匹配。
我该怎么做?
发布于 2021-07-01 10:27:46
您可以首先将嵌套列表扁平化,并以HashSet
的形式从列表中提取汽车模型的名称。:
Set<String> names = carDataList.stream()
.flatMap(cd -> cd.getCarDetails().stream())
.flatMap(det -> det.getCars().stream())
.map(Car::getModelName())
.collect(Collectors.toCollection(HashSet::new));
现在可以使用此集合的contains()
方法过滤List<CarModel>
models.stream()
.filter(model -> names.contains(model.getModel()))
.collect(Collectors.toList())
.forEach(m -> System.out.println(m.getModel()));
如果你只想要名单上的名字:
models.stream()
.map(CarModel::getModel)
.filter(names::contains)
.collect(Collectors.toList())
.forEach(System.out::println);
发布于 2021-07-01 10:25:46
首先,将modelName存储为regex或将其处理为regex (例如,BMW-500-7S-(.*)-Z100
而不是BMW-500-7S-*-Z100
)会更容易。
假设我们像这样使用正则表达式,我们可以使用一个流在所有modelNames上迭代,并过滤不存在于carData中的carModels:
List<String> modelNames = carData.getCarDetails().stream()
.flatMap(e -> e.getCars().stream())
.map(Car::getModelName)
.collect(Collectors.toList());
List<CarModel> result = carModels.stream()
.filter(carModel ->
modelNames.stream()
.anyMatch(name -> name.matches(carModel.getModel()))
).collect(Collectors.toList());
发布于 2021-07-01 11:11:32
尝尝这个。
List<CarModel> list1 = List.of(
new CarModel("2019", "BMW-500-7S-150-Z100"),
new CarModel("2019", "MERCEDES-700-7S-350-Z100"),
new CarModel("2018", "AUDI-100-Q6-350-Z100"));
List<CarData> list2 = List.of(
new CarData(OffsetDateTime.of(LocalDate.of(2021, 2, 6), LocalTime.of(0, 0), ZoneOffset.UTC),
List.of(new CarDetails("John", List.of(
new Car("BMW-500-7S-*-Z100", "Nevada"),
new Car("MERCEDES-700-7S-*-Z100", "Daytona"))))));
Pattern models = Pattern.compile(list2.stream()
.flatMap(d -> d.getCarDetails().stream())
.flatMap(d -> d.getCars().stream())
.map(c -> c.getModelName().replaceAll("\\*", ".*"))
.collect(Collectors.joining("|")));
List<CarModel> result = list1.stream()
.filter(m -> models.matcher(m.getModel()).matches())
.collect(Collectors.toList());
System.out.println(result);
产出:
[CarModel [year=2019, model=BMW-500-7S-150-Z100], CarModel [year=2019, model=MERCEDES-700-7S-350-Z100]]
https://stackoverflow.com/questions/68207226
复制相似问题