我是否按照正确的方式比较了两位arraylists

时间:2013-09-24 09:34:39

标签: java

我将从我的数据库获得两个Arraylists值,我将拥有两个具有相同数量的元素并具有相同顺序的ArrayLists。

我正在做一个测试,我需要比较两个ArrayLists。

以下是演示我遵循的方法的示例程序。 请告诉我是否有可能出现的环洞,我可能会错过。

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class Test {
    public static void main(String args[]) throws Exception {

        ArrayList<String> list1 = new ArrayList<String>();
        ArrayList<String> list2 = new ArrayList<String>();

        list1.add("Ravi");
        list1.add("fdfsd");
        list1.add("Sai");


        list2.add("Ravi");
        list2.add("fdfsd");
        list2.add("Sai");

        if(list1!=null && list2!=null){
                if(list1.size()==list2.size()){
                    for (int i = 0; i < list2.size(); i++) {
                        if (!list1.contains(list2.get(i))) {
                            System.out.println("Mismatch");

                        }
                    }

                    for (int i = 0; i < list1.size(); i++) {
                        if (!list2.contains(list1.get(i))) {
                            System.out.println("Mismatch");

                        }
                    }
                }else if(list1.size()!=list2.size()){
                    System.out.println("Mismatch");     
                }
        }
    }
}

3 个答案:

答案 0 :(得分:5)

首先,您不需要第二个循环。第一个循环本身就可以完成这项工作。其次,使用list1.equals(list2);有什么问题?来自List#equals(Object o) doc:

  

将指定对象与此列表进行比较以获得相等性。当且仅当指定的对象也是列表时,返回true,两个列表具有相同的大小,并且两个列表中的所有对应元素对都相等。 (如果e1,则两个元素e2(e1==null ? e2==null : e1.equals(e2))相等。)换句话说,如果两个列表包含相同顺序的相同元素,则它们被定义为相等。此定义确保equals方法在List接口的不同实现中正常工作。

因此,只有列表中元素的顺序相同时,equals()才有效。此外,对于例如Lists的元素类型不覆盖equals()方法的情况,这不起作用,例如:

List<int[]> list1 = Arrays.asList(new int[] {1, 2});
List<int[]> list2 = Arrays.asList(new int[] {1, 2});

System.out.println(list1.equals(list2));  // false

因此,要使List<E>.equals()方法起作用,元素类型E必须覆盖equals(),因此也必须覆盖hashCode()。在你的情况下,因为你有String作为元素类型,它会正常工作(当然,除非元素的顺序不同)。

例如,这也会失败:

List<String> list1 = Arrays.asList("a", "b");
List<String> list2 = Arrays.asList("b", "a");
list1.equals(list2);  // false

因此,如果顺序很重要,从某种意义上说,如果您不确定列表元素是否处于相同的顺序,那么您可以排序两个列表,然后执行{{1} }:

equals()

答案 1 :(得分:1)

  

我正在做一个测试,我需要比较两个ArrayLists。

List界面中有许多Util方法可以检查这一点。

我猜你需要containsAll()方法。

  

如果此列表包含指定集合的​​所有元素,则返回true。

http://docs.oracle.com/javase/7/docs/api/java/util/List.html#containsAll(java.util.Collection)

如果它们没有按顺序排列,

在比较之前进行排序

  Collections.sort(list1);
  Collections.sort(list2);  

然后比较它们。

答案 2 :(得分:0)

您可以使用List#removeAll(Collection)方法,并在从第一个列表中删除第二个列表后检查列表的大小。如果它大于0,则其不匹配。你需要先检查尺寸!

这样的事情: -

if (list1.size() == list2.size()) {
    list1.removeAll(list2);
    if (list1.size() == 0) {
        System.out.println("Match!");
    } else {
        System.out.println("Mismatch!");
    }
} else {
    System.out.println("Mismatch!");
}