利用HashMap键的唯一性去重集合内某个元素的字段一样的数据,并且新添加元素覆盖老添加元素

发布时间 2023-06-07 17:10:41作者: 洋辣子

场景:我在做excel导入的时候发现某个字段一样的数据出现好几条,但是在业务范围中,该字段不能重复,是唯一的,例如工号

解决办法:利用HashMap键的唯一性来删除某个字段重复的数据,将该字段作为键,值就是当前元素

 

我用 EasyExcel 做的导入

Listener 代码展示:

/**
 * @author 00063411
 */
public class WorkerChildDescListener extends AnalysisEventListener<SettleDataImport> {

    /**
     * 错误信息
     */
    private StringBuffer errorSb = new StringBuffer();

    /**
     * 序号
     */
    private int count = 1;

    /**
     * excel解析暂存数据
     */
    Map<String,SettleDataImport> dataMap = new HashMap<>();
private WorkerChildDescService workerChildDescService; public WorkerChildDescListener(WorkerChildDescService workerChildDescService){ this.workerChildDescService = workerChildDescService; } /** * 当数据转换发生错误时调用该方法 * @param exception * @param context * @throws Exception */ @Override public void onException(Exception exception, AnalysisContext context) throws Exception { this.count = this.count+1; this.errorSb.append("第").append(this.count).append("行数据有问题请仔细检查,"); } /** * 解析excel * @param settleDataImport * @param analysisContext */ @Override public void invoke(SettleDataImport settleDataImport, AnalysisContext analysisContext) { dataMap.put(settleDataImport.getStaffCode(),settleDataImport); this.count++; } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { if(StringUtils.isBlank(errorSb.toString())){ //表示没有错误,即将保存 saveData(); LoggerUtils.info("所有数据解析完成"); }else{ throw new CglException(errorSb.toString(),400); } } /** * 解析数据并保存 * 使用HashMap键唯一性将数据根据工号去重 */ private void saveData(){ List<WorkerChildDesc> childs = new ArrayList<>(); for (String s : this.dataMap.keySet()) { SettleDataImport sdi = dataMap.get(s); WorkerChildDesc desc = new WorkerChildDesc(); desc.setStaffCode(sdi.getStaffCode()); desc.setName(sdi.getName()); desc.setTu(sdi.getTu()); desc.setDept(sdi.getDept()); desc.setEntTime(sdi.getEntTime() != null ? DateUtils.format(sdi.getEntTime()) : null); desc.setTakeImageTime(sdi.getTakeImageTime() != null ? DateUtils.format(sdi.getTakeImageTime()) : null); desc.setFirstChildBirth(sdi.getFirstChildBirth() != null ? DateUtils.format(sdi.getFirstChildBirth()) : null); desc.setChildState(sdi.getChildState()); //是否享受本次结算 desc.setIsEnjoy(1); //是否新数据 0 否 desc.setIsNew(0); //数据状态 无需审核 desc.setStatus(2); childs.add(desc); } workerChildDescService.saveBatch(childs); } }