比如有对象A,有两个A类型的列表,ArrayList<A> srcList;和ArrayList<A>dstList,如何快速比较两个列表的值相同?

解决方案 »

  1.   

    Collections有没有提供对应方法,楼主搜下
      

  2.   

    好像问题没有描述清楚。如果想要的结果是比较每一个是否都相同的话,挨个比较就行了,前提是比较两个list的大小。如果你在list中是排了序的,那折半就ok啦
      

  3.   

    比较两个列表的元素是否一样,个数一样,元素一样,顺序可以不一致。比如srcList.get(i) 都存在 equals(dstList.get(j)),同样dstList.get(j)都存在equals(srcList.get(i))
      

  4.   

    重复元素呢?
    假设A列表   a  a  b 
       B列表   a   b  b 
    A B 是不是相等呢?
      

  5.   

    集合相等 ?
    是不是说,两个列表中的元素个数,和元素都相同?如果是,完成如下三个步骤就可以了。
    1、比较两个列表的长度(size),如果不同返回false;
    2、创建一个空的Set,分别将两个列表的元素都放入这个空的Set中去,
        如果这个Set的大小与列表的长度不同返回false;
    3、返回true;
      

  6.   

    这个好像不行吧 因为ArrayList  本身是允许重复的  如果是 a b b 和 a a b 按照 7楼的结果也是返回true!
    1.比较两个列表的长度(size),如果不同返回false;
    2.构造 对象A的哈希码  开2个线程 对  srcList dstList 进行关于哈希码的排序 
    3.进行比较 
      

  7.   

    第二步,是比较Set的大小和List的大小,楼上的例子,一个是3、一个是2当然就不相同了。
      

  8.   

    想了一下,重复元素的列表,7楼的方法,确实存在漏洞。
    那只能用笨办法了。
    一、比较两个列表的长度(size),如果不同返回false;
    二、先将两个列表进行排序,
    三、对应位置逐个进行比较,如果不对应相等,返回false;
    四、返回true;
      

  9.   

    恩 确实是,题目要是限制 ArrayList   对象不重复 那样比较 就没问题
    有重复的话 aab aab 比较出来也是 3 和2  返回就会是false了!
      

  10.   

    先把他们排序, 使用Arrays.sort()方法, 然后再使用ArrayList<A>的equals()方法进行比较就可以了.
      

  11.   

    楼主不必重复制造轮子。
    如果比较的标准是个数一样,元素一样,顺序可以不一致
    可以使用Apache Commons Collections库中的CollectionUtils工具类。ArrayList<String> coll1 = new ArrayList<String>();
    coll1.add("a1");
    coll1.add("a2");
        
    ArrayList<String> coll2 = new ArrayList<String>();
    coll2.add("a2");
    coll2.add("a1");
        
    boolean b = CollectionUtils.isEqualCollection(coll1, coll2);
    System.out.println(b); // trueCollectionUtils.isEqualCollection方法传入的是两个Collection对象,所以你可以比较所有实现了Collection接口的类。如:ArrayList<String> coll1 = new ArrayList<String>();
    coll1.add("a1");
    coll1.add("a2");
        
    HashSet<String> coll2 = new HashSet<String>();
    coll2.add("a2");
    coll2.add("a1");
        
    boolean b = CollectionUtils.isEqualCollection(coll1, coll2);
    System.out.println(b); // true
    Apache Commons Collections库的官方网站:
    http://commons.apache.org/collections/
      

  12.   

    CollectionUtils.isEqualCollection使用了一个非常巧妙的方法进行比较。想一下将Collection对象中的每一个元素取出来放到一个HashSet集合中最大的好处是可以快速定位元素,但HashSet不可以保存重复的内容。
    如果既想要快速定位元素又想要能处理内容相同的重复性元素,可以换一种方式:
    将Collection对象中的所有不同内容的元素作为KEY,相同内容的元素总数作为VALUE保存到一个HashMap中。例如:
    一个Collection集合
    "a1", "a2", "a1", "a3"转换成HashMap集合之后
    KEY    VALUE
    "a1"   2
    "a2"   1
    "a3"   1两个转换之后的HashMap集合,只要比较:
    1. 元素个数相同;
    2. 两个集合存在相同的KEY;
    3. 两个集合的每个KEY的VALUE也相同。
    上述比较都通过就可证明两个原始的Collection集合中的元素(不包括元素的排列顺序)是相同的。CollectionUtils.isEqualCollection使用的就是这种方法。    
      

  13.   

    HashSet就是用HashMap实现的
    用这种方式有一个前提条件,就是他的这两个个List保存的类型A或者它的某一super类型必须重写过hashCode()和equals()两个方法,不然HashMap就会用内存地址匹配,那样即使两个对象的值一样,在HashMap中还是不同的