`

比较两个List是否相等(相同元素)

阅读更多

  最近做的一个项目,需要校验两个List是否相等的问题,我们看看如何比较两个数组相等。数组是一个连续的内存空间,所以一般来说,两个数组相等,就是意味着他们有相同的长度,相同的元素,以及相同的顺序。我们看看JDK的Arrays.equals()实现就一目了然了。

public static boolean equals(int[] a, int[] a2) {
	if (a==a2) return true;
	if (a==null || a2==null) return false;
	int length = a.length;
	if (a2.length != length) return false;
	for (int i=0; i<length; i++)
		if (a[i] != a2[i]) return false;
	return true;
}

  大致分成下面4个步骤:

  a.检查是否指向同一个地址(不同引用);

  b.非空检查;

  c.长度检查;

  d.顺序和对应的元素相等检查。(依次比较,只要一个不等就返回false)

  而对于List来说,没有固定的顺序(ArrayList底层是数组,可以用数组的比较方法;但是其他的List,如LinkedList,就不一样了。),或者说顺序对List来说不是一个重要的属性。所以可以考虑其他方式来检查两个List是不是包含相同的元素。

  如JDK的Collection.containsAll(),只是是对每个元素进行contains()操作。但是List允许重复的元素,所以这里无法比较重复元素的数量:

public boolean containsAll(Collection<?> c) {
	for (Object e : c)
		if (!contains(e))
			return false;
	return true;
}

  那么,如何对无序的元素进行equal比较呢?

  比较简便直观的方法,就是分别对两个list排序,然后一个一个比较,只要不相等,则返回false,如果全部都相等,则返回true。

if (a.size() !=b.size())
    return false;
Collections.sort(a);
Collections.sort(b);
for (int i = 0; i <a.size(); i++) {
    if(!a.get(i).equals(b.get(i)))
       return false;
}
return true;

  但是这样两次排序,效率还是比较低的。所以可以通过Map来实现:

  先存入HashMap,key为元素,value为出现的次数,然后再逐个元素比较出现的次数,这样能确保元素都包含,而且出现次数相同。

  如下代码所示,具体可以参考org.apache.commons.collections.CollectionUtils.isEqualCollection() 。(CollectionUtils中大量使用了getCardinalityMap()的特性)

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.value
       if (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, newInteger(c.intValue() + 1));
       }
    }
    return count;
}
private static final int getFreq(Objectobj, Map freqMap) {
    Integer count =(Integer) freqMap.get(obj);
    if (count != null) {
       return count.intValue();
    }
    return 0;
}

 

文章来源:http://blog.csdn.net/tiwerbao/article/details/42836305

分享到:
评论

相关推荐

    比较两个集合是否相同(比较两个List内容是否相同)

    比较两个集合是否相同(比较两个List内容是否相同) 利用Java反射机制,获取到字段名、方法名、字段值,进行逐个比较,此处本人封装好了工具类,接收的是泛型,调用者只需要传入两个实体List即可进行比较,返回true...

    Java比较两个List的值是否相等的方法

    在Java编程中,比较两个List的值是否相等是一个常见的需求,特别是在处理数据集合时。这里我们探讨一种方法,用于判断两个List是否包含相同的元素,不论它们的顺序如何。这个方法的关键在于比较List的大小以及排序后...

    java比较两个list是否相同equals的代码详解

    Java比较两个List是否相同的equals方法详解 在 Java 编程中,比较两个 List 是否相同是一个非常重要的操作。今天,我们将探索 Java 中比较两个 List 是否相同的 equals 方法的实现。 首先,让我们了解一下为什么...

    两个list比较 取不同的对象

    ### 两个List比较取不同的对象 在Java编程中,经常需要对两个`List`进行比较,找出它们之间的差异。这通常涉及到数据结构的理解、算法设计以及编程实现等多个方面。本文将详细探讨如何通过一个示例代码来理解如何...

    java计算同一个list中是否有相同的值

    3. **内层循环**:对于每个当前元素,从列表末尾开始向前遍历,检查是否有与之相等的元素。如果找到,则将该元素添加到一个新的列表 `list2` 中,并从原列表 `list` 中移除它。 4. **计数**:计算 `list2` 的大小并...

    Java判断2个List集合是否相等(不考虑元素的顺序)

    在实际开发中,我们经常需要判断两个List集合是否相等,不考虑元素的顺序。今天,我们将探讨如何在Java中判断两个List集合是否相等,不考虑元素的顺序。 在Java中,List集合的equals方法默认是根据元素的顺序来判断...

    获取两个数组相同的元素或不同的元素输出

    `equals()`方法会检查两个数组的引用是否指向同一个对象,以及两个数组的长度是否相同,如果这两个条件都满足,再逐个比较每个元素是否相等。但是,这并不适用于找出相同或不同的元素,它只能告诉我们两个数组是否...

    【Robotframework】列表List的常用操作.pdf

    例如,`Lists Should Be Equal ${list} ${list1}` 判断两个列表是否相同。 8. **Remove From List**: 根据索引移除列表中的元素。例如,`Remove From List ${list} 0` 移除列表的第一个元素。 9. **Remove Values ...

    python找出一个列表中相同元素的多个索引实例

    `enumerate()`函数可以同时返回元素的索引和值,这样我们可以遍历整个列表,检查每个元素是否等于我们要查找的值(在这个例子中是1),并将匹配的索引添加到一个新的列表中。以下是实现这一功能的代码: ```python ...

    实现两个链表类的链接

    1. 找到较长链表的末尾,然后反向遍历较短的链表,每次插入一个带有值0的新节点,直到两个链表长度相等。 2. 初始化一个新的空链表`Result`用于存储结果,以及两个辅助变量`carry`(进位)和`current1`, `current2`...

    List集合多个复杂字段判断去重的案例

    在 Java 中,Object 类提供了一个默认的 equals 方法,该方法是通过比较对象的引用地址来判断两个对象是否相等的。这意味着,即使两个对象的成员变量的值相同,但他们的引用地址不同,那么在 Java 的 eyes 里,它们...

    Scala的List类方法整合

    此方法用于比较两个对象是否相等。 **示例代码:** ```scala val list1 = List(1, 2, 3) val list2 = List(1, 2, 3) val equalLists = list1.equals(list2) // 结果为 true ``` #### 16. `def exists(p: (A) =&gt; ...

    js代码-判断两个JSON LIST是否有交集

    在JavaScript中,判断两个JSON列表是否有交集可以通过遍历其中一个列表并检查其元素是否存在于另一个列表中来实现。这里有一个简单的算法: 1. 遍历第一个列表(例如list1)。 2. 对于每个元素,检查它是否在第二个...

    C# 有关List&lt;T&gt;的Contains与Equals方法.doc

    对于 `List&lt;T&gt;`,默认的 `Equals()` 方法会比较两个列表的长度和每个对应位置的元素是否相等。如果长度相同并且所有元素一一对应相等,那么两个列表就被认为是相等的。同样,自定义类型需要覆写 `Equals()` 方法以...

    Vue监听一个数组id是否与另一个数组id相同的方法

    在Vue.js中,有时我们需要监听两个数组中的元素是否存在相同的ID,并根据这个判断来更新视图或执行特定操作。本文将详细介绍如何在Vue中实现这样的功能。 首先,我们有两个数组,`list` 和 `shoplist`,它们的结构...

    Java中判断对象是否相等的equals()方法使用教程

    在实际编程中,`equals()`方法的正确实现是确保对象比较逻辑一致性的重要部分,尤其在处理集合类如`List`、`Set`时,`equals()`方法会被用来判断两个集合是否包含相等的元素。此外,当你重写`equals()`时,通常也...

    list常用方法

    两个`List`对象相等的条件是它们具有相同的元素并且顺序相同。 ```java boolean hashEquals = list.hashCode() == list2.hashCode(); ``` `hashCode`方法返回`List`对象的哈希码值。如果两个`List`对象通过`equals`...

    dotnet C# 使用 EqualityComparer 提升泛型值类型相等判断性能.rar

    而`EqualityComparer&lt;T&gt;.Default`提供了一个更高效的默认比较方式,尤其对于值类型,它会使用结构相等性,即内存中两个值是否完全相同。 2. **自定义比较器:** 对于某些情况,我们可能需要自定义比较逻辑,例如...

    Android List删除重复数据

    外层循环遍历列表,内层循环从后向前遍历列表,比较每个元素是否相等,如果相等则删除该元素。这种方法的时间复杂度为 O(n^2),因此不适合大型列表。 ```java public static void removeDuplicate(List list) { ...

    php中判断数组相等的方法以及数组运算符介绍

    如果你关心的是元素是否相同,而不在乎顺序或键的差异,`==` 可能足够了。如果需要更严格的相等性,包括元素顺序和类型,则使用 `===`。对于合并和对比数组的特定情况,`array_diff()`、`+` 运算符和 `array_merge()...

Global site tag (gtag.js) - Google Analytics