对ArrayList元素分组去重
来源:互联网 发布:手机淘宝哪里投诉卖家 编辑:程序博客网 时间:2024/04/30 09:57
概述
通常使用SQL
查询一批数据的时候,可以利用SQL
中的GROUP BY
语句对数据进行分组,但是有时候出于对性能的考虑,不会使用GROUP BY
,而是先把数据捞出来后,使用代码,在内存中按照某个属性进行分组。
当然有时候还会对分组里面的数据进行去重,这个时候也可以利用覆盖对象的hashCode
和equals
方法,利用HashSet
的去重特性来达到目的
代码
public class SkuVo { private Long skuId; private String productName; private Long brandStoreSn; public SkuVo(Long skuId, String productName, Long brandStoreSn) { super(); this.skuId = skuId; this.productName = productName; this.brandStoreSn = brandStoreSn; } public Long getSkuId() { return skuId; } public void setSkuId(Long skuId) { this.skuId = skuId; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public Long getBrandStoreSn() { return brandStoreSn; } public void setBrandStoreSn(Long brandStoreSn) { this.brandStoreSn = brandStoreSn; } @Override public String toString() { return "SkuVo [skuId=" + skuId + ", productName=" + productName + ", brandStoreSn=" + brandStoreSn + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((brandStoreSn == null) ? 0 : brandStoreSn.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; SkuVo other = (SkuVo) obj; if (brandStoreSn == null) { if (other.brandStoreSn != null) return false; } else if (!brandStoreSn.equals(other.brandStoreSn)) return false; return true; }}
假设从数据查询出一批数据,存在了List<SkuVo>
里面了。使用一个算法按照skuId
对List<SkuVo>
进行分组,skuId
相同的归为一组。如果小组里面的数据,brandStoreSn
出现重复,则进行去重操作。
分组去重算法
import java.util.Arrays;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set;public class TestArrayListGroupByTwoKey { public static void main(String[] args) { /*1、准备数据**/ SkuVo sku1 = new SkuVo(1L,"p1",100L); SkuVo sku2 = new SkuVo(2L,"p2",101L); SkuVo sku5 = new SkuVo(2L,"p5",100L); SkuVo sku3 = new SkuVo(3L,"p3",102L); SkuVo sku4 = new SkuVo(3L,"p3",102L); SkuVo sku6 = new SkuVo(5L,"p6",100L); List<SkuVo> skuVoList = Arrays.asList(new SkuVo [] {sku1,sku2,sku3,sku4,sku5,sku6}); /*2、分组算法**/ Map<Long, Set<SkuVo>> skuIdMap = new HashMap<>(); for (SkuVo skuVo : skuVoList) { Set<SkuVo> tempList = skuIdMap.get(skuVo.getSkuId()); /*如果取不到数据,那么直接new一个空的HashSet**/ if (tempList == null) { tempList = new HashSet<>(); tempList.add(skuVo); skuIdMap.put(skuVo.getSkuId(), tempList); } else { /*某个sku之前已经存放过了,则直接追加数据到原来的Set里, *如果brandStoreSn重复,利用HashSet的特性进行去重**/ tempList.add(skuVo); } } /*3、遍历map,验证结果**/ for(Long skuId : skuIdMap.keySet()){ System.out.println(skuIdMap.get(skuId)); } }}
结果如下
[SkuVo [skuId=1, productName=p1, brandStoreSn=100]][SkuVo [skuId=2, productName=p5, brandStoreSn=100], SkuVo [skuId=2, productName=p2, brandStoreSn=101]][SkuVo [skuId=3, productName=p3, brandStoreSn=102]][SkuVo [skuId=5, productName=p6, brandStoreSn=100]]
从输出结果看,数据已经按照skuId
进行分组了,同时小组内brandStoreSn相同的已经进行去重了。
0 0
- 对ArrayList元素分组去重
- ArrayList中元素去重问题
- 对列表元素去重
- mongodb分组去重
- 对数据库表中的某一字段去重分组排序
- 利用HashSet特性实现对ArrayList的去重
- 使用LinkedHashSet对ArrayList去重并保持原顺序
- 为ArrayList去重
- ArrayList去重
- ArrayList练习 ,去重
- c# ArrayList去重
- MongoDB 分组, 去重(转)
- oralce分组去重查询
- NSArray元素去重
- 数组元素去重
- NSArray元素去重
- 元素去重
- 数组元素去重
- java和c++执行相同代码(++a)*(++a),结果却不一样
- 中服软件获数千万A轮融资,打造国内顶级PaaS云平台
- OCR文字识别软件如何检测出图片上不同类型的区域
- Registers and Processor Modes
- building gradle project info问题
- 对ArrayList元素分组去重
- JavaScript的文字搬运工的功能
- 【Python】安装scipy库步骤
- linker command failed with exit code 1 (use -v to see invocation)
- .Net(C#)自定义WinForm控件之小结篇
- Git思维导图
- Mac电脑MAMP PRO集成环境Apache启动不了
- 欢迎使用CSDN-markdown编辑器
- onInterceptTouchEvent和onTouchEvent调用关系详解