代码之家  ›  专栏  ›  技术社区  ›  Virat

查找一个列表的对象是否存在于另一个列表中

  •  2
  • Virat  · 技术社区  · 7 年前

    List<AreaOfInterest> List<AreaOfInterestBean> . 相应的类是,

    @Entity
    @Data
    @Table( name = "interest_area" )
    public class AreaOfInterest {
    
        @Id
        @GeneratedValue( strategy = GenerationType.AUTO )
        @Column( name = "ia_id" )
        private Long id;
    
        @Column( name = "ia_value" )
        private String value;
    
        @Column( name = "ia_is_active" )
        private Boolean isActive;
    
        @Column( name = "ia_created_at" )
        private Calendar createdAt;
    
        @Column( name = "ia_is_approved" )
        private Boolean isApprovedByAdmin;
    
        @Column( name = "ia_approved_at" )
        private Calendar approvedAt;
    
    }
    

    @Data
    public class AreaOfInterestBean {
    
        private Long id;
    
        private String value;
    
        private boolean isSelected;
    }
    

    我想检查一下 列出感兴趣的区域; 列出感兴趣的区域; 如果是,我需要更新 列出感兴趣的区域; . 现在,我觉得我必须迭代两个列表来解决这个问题。有什么有效的方法吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Eugene    7 年前

    老实说,我不确定这件事的复杂性(我明天会想出来)。

    Set<String> left = nonBeans.stream()
                .map(AreaOfInterest::getValue)
                .collect(Collectors.toSet());
    
    beans.stream()
          .filter(x -> left.contains(x.getValue()))
          .forEach(x -> x.setSelected(true));
    

    在这种情况下,复杂性将是 O(n)

        2
  •  0
  •   Nikolas Charalambidis    7 年前

    假设:

    List<AreaOfInterest> list = /* ... */
    List<AreaOfInterestBean> listOfBeans = /* ... */
    

    两个简单的迭代很容易实现:

    for (int i=0; i<listOfBeans.size(); i++) {                // Iterate beans
        AreaOfInterestBean aoiBean = listOfBeans.get(i);      // Get each bean
        for (int j=0; j<list.size(); j++) {                   // Iterate entity
            AreaOfInterest aoi = list.get(j);                 // Get each entity
            if (aoiBean.getId() == aoi.getId()) {             // If they have the same ID
                aoiBean.setValue(aoi.getValue());             // Update the bean value
                break;                                        // Go to the next bean
            }
        }
    }
    

    示例:具有以下简化数据:

    • AreaOfInterest id value 1, "Car" , 2, "Bike" , 3, "Ship"
    • AreaOfInterestBeans 具有 价值 5, "Limo" , 2, "Scooter" , 7, "Yacht"

    结果 感兴趣的领域 2 : Scooter -> Bike

    • 感兴趣的领域 具有 价值 5,“豪华轿车” , 2,“自行车” 7,“游艇”

    另一条河道:

    listOfBeans = listOfBeans.stream()
                      .peek(aoiBean -> list.stream()
                                           .filter(aoi -> aoi.getId() == aoiBean.getId())
                                           .findFirst()
                                           .ifPresent(i -> aoiBean.setValue(i.getValue())))
                      .collect(Collectors.toList());