首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java :基于列表2中存在的对象的筛选列表1

Java :基于列表2中存在的对象的筛选列表1
EN

Stack Overflow用户
提问于 2021-07-01 08:54:22
回答 3查看 268关注 0票数 0

我试图根据另一个列表中的值筛选一个列表。我经历过其他类似的问题,并试图用它来达到我的目标,但我无法做到这一点。

列表1由类CarModel(L1)的对象组成。

代码语言:javascript
运行
复制
public class CarModel   {
  private String year;

  private String model;

}

列表2由类CarData(L2)的对象组成。

代码语言:javascript
运行
复制
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 list1CarModel.model of list2匹配的过滤list1

例如:

清单1由3个对象组成:

代码语言:javascript
运行
复制
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包含以下对象:

代码语言:javascript
运行
复制
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不匹配。

我该怎么做?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-07-01 10:27:46

您可以首先将嵌套列表扁平化,并以HashSet的形式从列表中提取汽车模型的名称。:

代码语言:javascript
运行
复制
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>

代码语言:javascript
运行
复制
models.stream()
     .filter(model -> names.contains(model.getModel()))
     .collect(Collectors.toList())
     .forEach(m -> System.out.println(m.getModel()));

如果你只想要名单上的名字:

代码语言:javascript
运行
复制
models.stream()
    .map(CarModel::getModel)
    .filter(names::contains)
    .collect(Collectors.toList())
    .forEach(System.out::println);
票数 0
EN

Stack Overflow用户

发布于 2021-07-01 10:25:46

首先,将modelName存储为regex或将其处理为regex (例如,BMW-500-7S-(.*)-Z100而不是BMW-500-7S-*-Z100 )会更容易。

假设我们像这样使用正则表达式,我们可以使用一个流在所有modelNames上迭代,并过滤不存在于carData中的carModels:

代码语言:javascript
运行
复制
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());
票数 0
EN

Stack Overflow用户

发布于 2021-07-01 11:11:32

尝尝这个。

代码语言:javascript
运行
复制
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);

产出:

代码语言:javascript
运行
复制
[CarModel [year=2019, model=BMW-500-7S-150-Z100], CarModel [year=2019, model=MERCEDES-700-7S-350-Z100]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68207226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档