今天在项目中真正遇到了需要操作List集合,要求去掉List集合中重复的实体类。
以前在研究的时候,忽略了最最基本的,当时认为太简单了,以至于今天的多次调试。
好了,先来记录本次操作成功的经验。
从前端页面传递了一个Array数组到后端,这个Array数组中有超过100条数据,但是这些数据有大量重复的。后端Controller中方法使用List<Entity>接收。因此,当前的List<Entity>的集合长度为100+。
现在的目标是将这个List<Entity>中的数据重复的全部去掉,却是一筹莫展。Entity实体类的属性起码有15条,如此多的属性如何才能一条一条的去对比它们,难道要遍历此集合,一条属性一条属性的遍历吗?这显然会耗费大量的性能。
因为Entity这个实体类是以前开发定义的,现在我要用到这个实体类。但是发现这个实体类没有重写hashcode与equals方法。因此我这样做了:
@Override public int hashCode() { //计算一个hashCode由计算此id的值来判断 if(this.getId() == null){ return -1; } return this.getId().intValue(); } //为了判断从hotkey页面传过来的实体是否是同一个 @Override public boolean equals(Object obj) { //判断依据为相同的id则认为是同一个快捷键实体 if (!(obj instanceof Entity)) { return false; } HotKeyEntity hotKeyEntity = (HotKeyEntity) obj; if(hotKeyEntity.getId() == null){ return false; } if(this.getId() == null){ return false; } return this.getId().intValue() == hotKeyEntity.getId().intValue(); }
/** * 因为前端传过来的数组中封装了每次点击的实体对象 * 而真正有价值的数据是用户最后一次操作的那个实体对象 * 因此,需要将此方法上的Entity这个list集合去掉重复 * 对于实体来说,需要重写hashcode与equals方法 */ final Set<HotKeyEntity> set = Sets.newHashSet(); //去掉重复,倒序遍历。 int size = hotKeyEntity.size(); for (int i = size - 1; i >= 0; i--) { //已经重写HotkeyEntity的equals方法,如果id一样则认为是一致的 set.add(hotKeyEntities.get(i)); } //清空 hotKeyEntities.clear(); //重新添加 hotKeyEntities.addAll(set);
真是纸上得来终觉浅,绝知此事要躬行。以前的 JDK1.7 HashMap集合源代码探索力度看样子不够啊,忽略了最简单却又是最本质的东西。