判断两个List元素是否相同;
判断两个List元素是否相同,注释的很清楚,先看一下工具类:
评论区有小哥提出下面这种写法对于集合中有重复元素时,会判断不准确;这个坑记录一下;
不要用下面这个方法!!!
/*** 注!!!!!!→ 集合中的元素必须重写equals方法自行判断元素是否相同* 哈希地址相同 返回true* 如果两个参数都为空,则返回true* 如果有一项为空,则返回false* 如果数据长度不相同,则返回false* 集合1包含集合2中的所有元素,并且集合2也包含集合1中的所有元素 则返回true* 注!!!!!!→ 集合中的元素必须重写equals方法自行判断元素是否相同* @param l0* @param l1* @return*/public static boolean isListEqual(List l0, List l1){if (l0 == l1)return true;if (l0 == null && l1 == null)return true;if (l0 == null || l1 == null)return false;if (l0.size() != l1.size())return false;if (l0.containsAll(l1) && l1.containsAll(l0)){return true;}return false;}
分别比较两个List集合的哈希地址、NULL判断,长度判断、和内容判断;
但有一点特别显眼:集合中的元素必须重写equals方法自行判断元素是否相同
原因:containsAll方法的逻辑是逐个contains,而contains的包含逻辑是equals判断;如果集合中的元素没有重写equals方法,那么即使你的元素完全相同,比较的也是不准确;
请使用这个工具类!!!
public class ListUtils {/*** 注!!!!!!→ 集合中的元素必须重写equals方法自行判断元素是否相同* 哈希地址相同 返回true* 如果两个参数都为空,则返回true* 如果有一项为空,则返回false* 如果数据长度不相同,则返回false* 集合1包含集合2中的所有元素,并且集合2也包含集合1中的所有元素 则返回true* 注!!!!!!→ 集合中的元素必须重写equals方法自行判断元素是否相同* @param l0* @param l1* @return*/public static boolean isListEqual(List l0, List l1){if (l0 == l1)return true;if (l0 == null && l1 == null)return true;if (l0 == null || l1 == null)return false;if (l0.size() != l1.size())return false;if (isEqualCollection(l0 , l1) && l0.containsAll(l1) && l1.containsAll(l0)){return true;}return false;}private static final Integer INTEGER_ONE = 1;public static boolean isEqualCollection(Collection a, Collection b){if (a.size() !=b.size()) { // size是最简单的相等条件return false;}Map mapa = getCardinalityMap(a);Map mapb = getCardinalityMap(b);// 转换map后,能去掉重复的,这时候size就是非重复项,也是先决条件if (mapa.size() !=mapb.size()) {return false;}Iterator it =mapa.keySet().iterator();while (it.hasNext()) {Object obj = it.next();// 查询同一个obj,首先两边都要有,而且还要校验重复个数,就是map.valueif (getFreq(obj,mapa) != getFreq(obj, mapb)) {return false;}}return true;}/*** 以obj为key,可以防止重复,如果重复就value++* 这样实际上记录了元素以及出现的次数*/public static Map getCardinalityMap(Collection coll) {Map count = new HashMap();for (Iterator it =coll.iterator(); it.hasNext();) {Object obj =it.next();Integer c =(Integer) count.get(obj);if (c == null)count.put(obj, INTEGER_ONE);else {count.put(obj, new Integer(c.intValue() + 1));}}return count;}private static final int getFreq(Object obj, Map freqMap) {Integer count =(Integer) freqMap.get(obj);if (count != null) {return count.intValue();}return 0;}}
测试1,没有重写equals:
public class BaseControllerCommandBean {private String comdName;private String comdValue;public BaseControllerCommandBean(){}public BaseControllerCommandBean(String name, String value){comdValue = value;comdName = name;}public String getComdName() {return comdName;}public void setComdName(String comdName) {this.comdName = comdName;}public String getComdValue() {return comdValue;}public void setComdValue(String comdValue) {this.comdValue = comdValue;}public static void main(String[] gin){ArrayList l0 = new ArrayList();l0.add(new BaseControllerCommandBean("1","ccc"));l0.add(new BaseControllerCommandBean("123","abc"));ArrayList l1 = new ArrayList();l1.add(new BaseControllerCommandBean("1","ccc"));l1.add(new BaseControllerCommandBean("123","abc"));System.out.println(ListUtils.isListEqual(l0,l1));}
}
测试2,重写equals以后:
public class BaseControllerCommandBean {private String comdName;private String comdValue;public BaseControllerCommandBean(){}public BaseControllerCommandBean(String name, String value){comdValue = value;comdName = name;}public String getComdName() {return comdName;}public void setComdName(String comdName) {this.comdName = comdName;}public String getComdValue() {return comdValue;}public void setComdValue(String comdValue) {this.comdValue = comdValue;}@Overridepublic boolean equals(Object obj) {if (this == null && obj == null)return true;if (this == null || obj == null)return false;if (obj.getClass() != this.getClass())return false;BaseControllerCommandBean objBean = (BaseControllerCommandBean) obj;
// if (TextUtils.equals(this.comdName,objBean.comdName) && TextUtils.equals(this.comdValue,objBean.comdValue))if (this.comdName.equals(objBean.comdName) && this.comdValue.equals(objBean.comdValue))return true;return false;}public static void main(String[] gin){ArrayList l0 = new ArrayList();l0.add(new BaseControllerCommandBean("1","ccc"));l0.add(new BaseControllerCommandBean("123","abc"));ArrayList l1 = new ArrayList();l1.add(new BaseControllerCommandBean("1","ccc"));l1.add(new BaseControllerCommandBean("123","abc"));System.out.println(ListUtils.isListEqual(l0,l1));}
}
集合中的泛型使用这个,判断元素是否相同就正确了;
判断两个List元素是否相同;相关推荐
- go 判断元素是否在slice_golang 判断 两个slice 是否相等
目录 在golang中我们可以轻松地通过==来判断两个数组(array)是否相等,但遗憾的是slice并没有相关的运算符,当需要判断两个slice是否相等时我们只能另寻捷径了. slice相等的定义 ...
- MATLAB——判断两个矩阵的元素是否完全相同
1 致谢 感谢网友Inside_Zhang的帮助, 链接如下: https://blog.csdn.net/lanchunhui/article/details/50717400 2 前言 今天在学习 ...
- C语言——判断两个数组中是否有相同的元素
题目:判断两个数组中是否有相同的元素,有就输出"有",没有就输出"没有". 解法一:用第一个数组中的所有元素与第二个数组中的所有元素相比较,若有相同元素,则停止 ...
- 表单实例(判断两次密码是否一致)
表单实例(判断两次密码是否一致) 一.实例描述: 本例是一个综合性的练习,除了们正在学习的JS知识外,还用到了HTML的表格,表单等相关知识. 二.截图 三.代码 1 <!DOCTYPE htm ...
- 判断两棵树是否相等与使用二叉链表法建立二叉搜索树
//判断两个二叉树是否相等 //提问如果两个二叉树的前序遍历相等,能否说明,这两个树相等? //答案是否定的,只有这两个树的 A前序=B前序,A中序=B中序才可以. BOOL isEqualTree( ...
- 集合 判断是否为同一元素 总结
集合判断是否是同一元素的策略总结 总结: 对于List集合,仅仅是通过判断两个对象的[equals]方法是否为true 对于Hash系列的集合,是先判断对象的[hashCode]返回值是否相同,再判断 ...
- golang 判断 两个slice 是否相等
目录 slice相等的定义 判断两个[]byte是否相等 使用reflect判断slice是否相等 手写判断 在golang中我们可以轻松地通过==来判断两个数组(array)是否相等,但遗憾的是sl ...
- python中怎么比较两个列表-Python两个列表元素比较
Python两个列表元素的对比经常遇到,如何正确的比较? 知识点:列表解析. 详解: 列表解析 List Comprehensions 表达式:[expression for iter_val in ...
- Python语言学习:利用pandas对两列字段元素求差集(对比两列字段所有元素的异同)
Python语言学习:利用pandas对两列字段元素求差集(对比两列字段所有元素的异同) 目录 利用pandas对两列字段元素求差集(对比两列字段所有元素的异同) 输出结果 实现代码 利用pandas ...
最新文章
- 云计算已成创新基础设施,三大暗流左右未来“云市场”
- Git命令按人统计提交次数和代码量
- XGBoost在携程搜索排序中的应用
- system 无法以 sysdba 登录,提示:权限不足。
- java source folder作用_java项目把源码放到folder里,不是source folder,这个java代码还能被调用吗?...
- vlan间路由的问题
- 如何在Java中针对XSD验证XML
- 爬虫(二)-创建项目应用
- 菜鸟教程 程序员学习网站
- 中国大侠vs生化战士(转)
- 数字后端基本技能之:绕线Congestion怎么解?
- bat计算机清理原理,科技教程:电脑如何一键清除垃圾bat
- 笔记连载 | Day6 FPGA三种建模方式区别及Verilog语法基础篇
- 联想e470锁定计算机,联想E470c电脑设置硬盘启动的方法,你值得拥有!
- Oracle中对数据分组统计
- Delphi桌面精灵开发
- 01-HTML学习笔记
- 计算机插入的图片怎么改成线条格式,电脑把CAD转化为JPG格式后图片不清晰怎么办...
- app inventor2环境搭建
- UE4 unix13位时间戳 转Windows DateTime