博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CollectionUtils.isEqualCollection的用法
阅读量:5236 次
发布时间:2019-06-14

本文共 2616 字,大约阅读时间需要 8 分钟。

在使用Java的集合时,有些时候会需要比较两个集合是否相等,自己写方法其实也简单,但是既然有了好的实现,就不要自己造轮子了,只要了解这个轮子是什么原理就好了。

public static boolean isEqualCollection(final Collection
a, final Collection
b)

 

传入两个Collection就可以了,我们常用的List或者Set,根据源码发现:

这个方法比较的是集合中的元素以及元素的个数,不管是List或者是Set,不要求顺序相同。

下面是一个例子,其中的源码可能因为版本更迭与最新的不同,但是原理是一样的:

package collection;import java.util.ArrayList;import java.util.Collection;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import org.apache.commons.collections4.CollectionUtils;import org.junit.Test;public class Test1 {	// CollectionUtils.isEqualCollection	/**	 * isEqualCollection	 * 	 * public static 
boolean isEqualCollection(Collection
a, Collection
b) Returns true iff the given Collections contain exactly the same elements with exactly the same cardinalities. * That is, iff the cardinality of e in a is equal to the cardinality of e in b, for each element e in a or b. * * Parameters: * a - the first collection, must not be null * b - the second collection, must not be null * Returns: * true iff the collections contain the same elements with the same cardinalities. * */ @Test public void test1() { ArrayList
arr1 = new ArrayList
(); arr1.add("1"); arr1.add("2"); arr1.add("2"); arr1.add("3"); arr1.add("4"); arr1.add("5"); ArrayList
arr2 = new ArrayList
(); arr2.add("1"); arr2.add("1"); arr2.add("2"); arr2.add("3"); arr2.add("5"); arr2.add("4"); System.out.println(CollectionUtils.isEqualCollection(arr1, arr2)); // copy的源码 System.out.println(isEqualCollection(arr1, arr2)); } public static boolean isEqualCollection(Collection a, Collection b) { if (a.size() != b.size()) return false; Map mapa = getCardinalityMap(a); Map mapb = getCardinalityMap(b); if (mapa.size() != mapb.size()) return false; for (Iterator it = mapa.keySet().iterator(); it.hasNext();) { Object obj = it.next(); if (getFreq(obj, mapa) != getFreq(obj, mapb)) return false; } return true; } private static Integer INTEGER_ONE = new Integer(1); 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(); else return 0; }}

转载于:https://www.cnblogs.com/huangwenjie/p/6648322.html

你可能感兴趣的文章
springboot2.0最精简的配置yml
查看>>
java获得系统换行
查看>>
Asp.Net 客户端 实现语音(TTS)功能
查看>>
c# 访问修饰符的访问权限
查看>>
用js实现简单的点击左右运动
查看>>
解决vue项目中的“Invalid Host header”
查看>>
起调UWP的几种方法
查看>>
mysql实战优化之四:mysql索引优化
查看>>
CPU-bound(计算密集型) 和I/O bound(I/O密集型)
查看>>
MySQL开发规范
查看>>
Native Method (转)
查看>>
ie6 css expression 实现min-width/max-width
查看>>
Quartz--Trigger
查看>>
BLUEKING----蓝鲸
查看>>
【bzoj5101】[POI2018]Powód 并查集
查看>>
微信公众平台开发(83) 生成带参数二维码
查看>>
小程序接口记录
查看>>
【Idea】idea code style配置eclipse code formatter
查看>>
实例应用,做了一个网页
查看>>
P2P网络数据处理流程
查看>>