比较findAll()中的java元素

比较findAll()中的java元素,java,spring,list,repository,crud,Java,Spring,List,Repository,Crud,我必须从从Crudepository检索的对象列表中删除重复项 我做到了: if (!prospectionRepository.findAll().isEmpty()) { List<Prospection> all = prospectionRepository.findAll(); for (int i = 0; i < all.size()-1; i++) { for (int k = i+1;k < all.size(); k++

我必须从从Crudepository检索的对象列表中删除重复项

我做到了:

if (!prospectionRepository.findAll().isEmpty()) {
    List<Prospection> all = prospectionRepository.findAll();
    for (int i = 0; i < all.size()-1; i++) {
        for (int k = i+1;k < all.size(); k++) {
            if (all.get(i).getProspectNumber() == all.get(k).getProspectNumber()) {
                all.remove(all.get(i));
            }
        }
    }
    prospectionRepository.save(all);
}
if(!prospectionRepository.findAll().isEmpty()){
List all=prospectionRepository.findAll();
对于(int i=0;i

但是,不会从列表中删除重复项,然后在我不想删除时将其保留。

为什么不使用“浏览编号”作为值的哈希集。哈希集不能包含重复的键。之后,您可以迭代列表并删除所有重复的元素。希望这对你有帮助

您可以使用

List<Prospection> all = prospectionRepository.findAll();
Set<Object> prospectNumbers = new HashSet<Object>();
Iterator<Prospection> it = all.iterator();
while (it.hasNext()) {
    Prospection item = iterator.next();
    Object itemNumer = item.getProspectNumber();
    if (prospectNumbers.contains(itemNumber)) {
        it.remove();
    } else {
        prospectNumbers.add(itemNumber);
    }
}
List all=prospectionRepository.findAll();
Set prospectNumber=新的HashSet();
Iterator it=all.Iterator();
while(it.hasNext()){
Prospection item=iterator.next();
Object itemNumer=item.getProspectNumber();
if(prospectNumber.contains(itemNumber)){
it.remove();
}否则{
浏览编号。添加(itemNumber);
}
}
问题编辑 在聊天室中进行对话后,必须考虑其他参数:

  • 多个
    Prospect
    可能具有相同的
    Prospect编号
    ,但它们在数据库中具有唯一的主键。因此,重复筛选器不能依赖于
    潜在客户
    相等性
  • Prospect
    具有已访问状态,该状态定义了公司是否已联系该
    Prospect
    。两种主要状态是
    NEW
    MET
    。只能满足一个
    潜在客户
    。其他副本(具有相同的
    潜在客户编号
    )只能是
    新的
  • 算法 这个问题需要另外一个步骤来解决:

  • 潜在客户需要按
    潜在客户编号
    进行分组。在这个阶段,我们将创建一个
    映射。但是,根据前面定义的规则,
    列表必须以单个元素结尾
  • 在列表中,如果未满足该潜在客户的要求,并且发现另一个潜在客户的状态为“已满足”,则第一个潜在客户将被丢弃
  • 因此,将使用以下规则生成列表:

    • 如果某个潜在客户在潜在客户编号方面没有重复项,则无论其状态如何,都会保留该潜在客户
    • 如果潜在客户的潜在客户编号重复,则只保留
      met
      一个
    • 如果多个潜在客户具有相同的潜在客户编号,但没有一个符合
      要求,则满足任意一个:
      不保证按列表顺序循环
    代码 诀窍是通过
    映射
    ,因为键将保持唯一性。如果您的propect number是一种特定类型,则假定已正确定义了
    equals()
    hashCode()

    免责声明:代码未经测试

    List all=prospectionRepository.findAll().stream()
    //我们在这里实例化一个映射
    //没有必要有地图
    //因为合并函数将为我们进行排序
    .collect(collector.toMap)(
    //关键:使用潜在客户编号
    prospect->prospect.getProspectNumber(),
    //值:使用propect对象本身
    展望->展望,
    //合并功能:两个具有相同潜在客户编号的潜在客户
    //已找到:保留已满足状态的或第一个
    (老客户,新客户)->{
    if(oldProspect.getStatus()==MET){
    回归前景;
    }else if(newProspect.getStatus()==MET){
    返回新的前景;
    }否则{
    //返回第一个,任意决定
    回归前景;
    }
    }
    ))
    //仅获取地图值
    .values()
    //对其进行流式处理,以便将其作为列表收集
    .stream()
    .collect(Collectors.toList());
    prospectionRepository.save(全部);
    
    Map.values()
    实际上返回一个
    集合
    。因此,如果您的
    prospectionRepository.save(…)
    可以接受
    集合
    (不仅是
    列表
    ),您可以更快地完成。我还使用以下同义词:

    • Prospect::getProspectNumber
      是与
      Prospect->Prospect.getProspectNumber()等价的
      函数
    • :相当于
      prospect->prospect
    • 三值运算符:它返回相同的内容,但写入方式不同
    Collection all=prospectionRepository.findAll().stream()
    .collect(collector.toMap)(
    Prospect::getProspectNumber,
    Function.identity(),
    (oldProspect,newProspect)->newProspect.getStatus()==MET?newProspect:oldProspect
    )).values();
    prospectionRepository.save(全部);
    

    请参考,如果两个具有相同的
    ProspectNumber
    Prospection
    相等,那么一个简单的示例就足够了:

    List<Prospection> all = prospectionRepository.findAll()
            .stream()
            .distinct()
            .collect(Collectors.toList());
    prospectionRepository.save(all);
    
    List all=prospectionRepository.findAll()
    .stream()
    .distinct()
    .collect(Collectors.toList());
    prospectionRepository.save(全部);
    

    哈希集没有键。你是说HashMap吗?哇,对不起!我弄糊涂了。是的,HashSet没有键,但是他可以使用HashSet获取所有不重复的键,然后使用该HashSet在列表上迭代并删除重复项。谢谢!