我们通过Map来实现:
把List 存入HashMap,key为元素,value为出现的次数,然后再逐个元素比较出现的次数,这样能确保元素都包含,而且出现次数相同。
具体参考代码如下:
private static final Integer INTEGER_ONE = 1;
/** * 比较两个List是否相同 * * @param a 集合a * @param b 集合b * @return */ public static boolean isEqualCollection(Collection a, Collection b){ // size是最简单的相等条件 if (a.size() !=b.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.value if (getFreq(obj,mapa) != getFreq(obj, mapb)) { return false; } } return true; } /** * List转换成Map;以obj为key,可以防止重复,如果重复就value++,这样实际上记录了元素以及出现的次数 * * @param coll * @return */ private 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; }