比较findAll()中的java元素
我必须从从Crudepository检索的对象列表中删除重复项 我做到了:比较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++
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在列表上迭代并删除重复项。谢谢!