Java数组列表之间的比较 比如有对象A,有两个A类型的列表,ArrayList<A> srcList;和ArrayList<A>dstList,如何快速比较两个列表的值相同? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Collections有没有提供对应方法,楼主搜下 好像问题没有描述清楚。如果想要的结果是比较每一个是否都相同的话,挨个比较就行了,前提是比较两个list的大小。如果你在list中是排了序的,那折半就ok啦 比较两个列表的元素是否一样,个数一样,元素一样,顺序可以不一致。比如srcList.get(i) 都存在 equals(dstList.get(j)),同样dstList.get(j)都存在equals(srcList.get(i)) 重复元素呢?假设A列表 a a b B列表 a b b A B 是不是相等呢? 集合相等 ?是不是说,两个列表中的元素个数,和元素都相同?如果是,完成如下三个步骤就可以了。1、比较两个列表的长度(size),如果不同返回false;2、创建一个空的Set,分别将两个列表的元素都放入这个空的Set中去, 如果这个Set的大小与列表的长度不同返回false;3、返回true; 这个好像不行吧 因为ArrayList 本身是允许重复的 如果是 a b b 和 a a b 按照 7楼的结果也是返回true!1.比较两个列表的长度(size),如果不同返回false;2.构造 对象A的哈希码 开2个线程 对 srcList dstList 进行关于哈希码的排序 3.进行比较 第二步,是比较Set的大小和List的大小,楼上的例子,一个是3、一个是2当然就不相同了。 想了一下,重复元素的列表,7楼的方法,确实存在漏洞。那只能用笨办法了。一、比较两个列表的长度(size),如果不同返回false;二、先将两个列表进行排序,三、对应位置逐个进行比较,如果不对应相等,返回false;四、返回true; 恩 确实是,题目要是限制 ArrayList 对象不重复 那样比较 就没问题有重复的话 aab aab 比较出来也是 3 和2 返回就会是false了! 先把他们排序, 使用Arrays.sort()方法, 然后再使用ArrayList<A>的equals()方法进行比较就可以了. 楼主不必重复制造轮子。如果比较的标准是个数一样,元素一样,顺序可以不一致。可以使用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); // trueApache Commons Collections库的官方网站:http://commons.apache.org/collections/ 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使用的就是这种方法。 HashSet就是用HashMap实现的用这种方式有一个前提条件,就是他的这两个个List保存的类型A或者它的某一super类型必须重写过hashCode()和equals()两个方法,不然HashMap就会用内存地址匹配,那样即使两个对象的值一样,在HashMap中还是不同的 关于接口问题!! 多态又见多态!!高手请进,static到底能不能覆盖!!!!! 怎么找不到.class文件呢??? 问个简单的问题,请高手看看,这个文件有关输入输出流的程序,出什么错了,是什么原因?在线等待》 关于 C struct 和java object Java中如何读取系统变量的值 请问Comparable和Comparator 这两个类有什么区别在使用的时候 双缓冲无法解决frame闪屏问题求教 请教,怎么做客户需求 ---初级问题,byte类型到底表示什么含义-- 正则表达式 高手来! 正则捕获分组并替换
假设A列表 a a b
B列表 a b b
A B 是不是相等呢?
是不是说,两个列表中的元素个数,和元素都相同?如果是,完成如下三个步骤就可以了。
1、比较两个列表的长度(size),如果不同返回false;
2、创建一个空的Set,分别将两个列表的元素都放入这个空的Set中去,
如果这个Set的大小与列表的长度不同返回false;
3、返回true;
1.比较两个列表的长度(size),如果不同返回false;
2.构造 对象A的哈希码 开2个线程 对 srcList dstList 进行关于哈希码的排序
3.进行比较
那只能用笨办法了。
一、比较两个列表的长度(size),如果不同返回false;
二、先将两个列表进行排序,
三、对应位置逐个进行比较,如果不对应相等,返回false;
四、返回true;
有重复的话 aab aab 比较出来也是 3 和2 返回就会是false了!
如果比较的标准是个数一样,元素一样,顺序可以不一致。
可以使用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/
如果既想要快速定位元素又想要能处理内容相同的重复性元素,可以换一种方式:
将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使用的就是这种方法。
用这种方式有一个前提条件,就是他的这两个个List保存的类型A或者它的某一super类型必须重写过hashCode()和equals()两个方法,不然HashMap就会用内存地址匹配,那样即使两个对象的值一样,在HashMap中还是不同的