-2

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

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

以下是一个示例程序,用于演示我遵循的方法。请让我知道是否有可能出现的循环漏洞,我可能会错过。

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");     
                }
        }
    }
}
4

3 回答 3

5

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

比较指定对象与此列表是否相等。true当且仅当指定对象也是一个列表时返回,两个列表具有相同的大小,并且两个列表中所有对应的元素对都相等。(如果 ,则两个元素e1e2相等(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

因此,如果顺序很重要,从某种意义上说,如果您不确定列表元素的顺序是否相同,那么您可以对两个列表进行排序,然后执行equals()

Collections.sort(list1);
Collections.sort(list2);
list1.equals(list2);  // true
于 2013-09-24T09:40:13.440 回答
1

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

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

我猜你需要containsAll() 方法。

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

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

万一他们不按顺序来,

在比较之前进行排序

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

然后比较它们。

于 2013-09-24T09:38:22.970 回答
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!");
}
于 2013-09-24T09:39:41.277 回答