如何有效地检查两个不同类型列表(A类和B类)的公共元素,并为所有匹配生成A类型的结果列表

问题描述 投票:0回答:1

我有一个包含 1000 个元素的 A 类列表,其中所有元素都有唯一的 id。还有一些其他的 B 类,它也有一个唯一的 id 参数,并且这个 B 是 A 类的 json 属性。 关系如下:

A:{“id”:id1, “使用者”:{ "type": "一些代表 B 类的 ENUM", “id”:“id2”, } },

对象 A 中使用的对象 B 是独立的,也可以从其他请求中外部删除,这使得依赖的 A 对象过时/无效。系统中还可以有许多其他类型 B 的对象,并非所有对象都需要与 R 类型链接。

任务是检查系统中所有不再存在依赖B的无效A对象,并定期删除这些无效A。

任何人都可以告诉一个更好的方法来解决这个问题,谢谢。

首先,我列出了 l1 中 A 类的所有元素,然后列出了 l2 中 A 类中使用的 B 类的所有唯一 ID。 现在有一个列表 l3 ,其中收集了 B 类的所有此类无效 id,这些 ID 在 l2 中但不在 ( l1.gentContent().getUsedBy().getId() ) 中

现在列表 l3 包含所有此类不存在的类型 B id ,并且对于所有这些 id ,必须删除依赖的 A 类对象。但是该方法使用了许多 if else 和嵌套循环,这首先看起来并不令人印象深刻,而且软件质量检查也不可接受,因为方法中只允许使用 3 个 if/else/for 。

任何人都可以告诉一个更好的方法来解决这个问题,谢谢。

**这是我尝试过的截图样本**

public void validateForAutoCleanUp(OperationContext context, Page page) {

List invalidsToDelete = new ArrayList<>(); 列出现有 = page.getContent().stream().toList();

    List<String> usedByIds = page.getContent().stream().map(Class A::getUsedBy).map(UsedBy::getId).toList();

   List<Class B> b = service.getAllofTypeB(context, pageNumber, pageSize, null, null).block();
    if (b != null) {
        List<String> invalidUsedByIds = usedByIds.stream().filter(id -> ! b.stream().map(Class B::getId).toList().contains(id)).toList();
        if (!invalidUsedByIds.isEmpty()) {
            for (Class A a : existing) {
                for (String invalidId : invalidUsedByIds) {
                    if (a.getUsedBy().getId().equals(invalidId)) {
                        invalidsToDelete.add(a);
                        break;
                    }
                }
            }
            if (!invalidsToDelete.isEmpty())
                invalidsToDelete.forEach(i -> service.deleteById(context, i.getId()).block());
    } else {
        page.getContent().forEach(a -> service.deleteById(context, a.getId()).block());
    }
}
java list loops collections iteration
1个回答
0
投票

为了更有效地解决问题并降低 if 和 for 的复杂性,您可以使用 Set 来实现快速搜索并消除嵌套循环。

  • 使用Set进行快速搜索
  • 消除嵌套循环
  • 减少条件

类似这样的:

public void validateForAutoCleanUp(OperationContext context, Page page) {
    List<ClassA> existing = page.getContent();
    Set<String> usedByIds = existing.stream()
                                     .map(a -> a.getUsedBy().getId())
                                     .collect(Collectors.toSet());

    List<ClassB> classBList = service.getAllofTypeB(context, pageNumber, pageSize, null, null).block();

    if (classBList != null) {
        Set<String> validBIds = classBList.stream()
                                          .map(ClassB::getId)
                                          .collect(Collectors.toSet());

        List<ClassA> invalidsToDelete = existing.stream()
                                                .filter(a -> !validBIds.contains(a.getUsedBy().getId()))
                                                .collect(Collectors.toList());

        invalidsToDelete.forEach(a -> service.deleteById(context, a.getId()).block());
    } else {
        existing.forEach(a -> service.deleteById(context, a.getId()).block());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.