如何判断两个list有两个list取相同的元素素

C# List 的一些操作 (两List元素是否想同,List是否包含在另一个List中) - 快乐家++ - 博客园
posts - 241, comments - 165, trackbacks - 0, articles - 14
一、 假设有两个List&T&对象 ,List1和List2,如下方法判断两个List是否相等
List1.All(List2.Contains) && List1.Count == List2.Count
二、&&C#中如何判断list是否完整包含另一个list
bool IsContainsAll(List&Class& ListA, List&Class& ListB)
return ListB.All(b =& ListA.Any(a =& a.equal( b )));
如果list中存放的是标准数据类型,更简单了,只需要 将&a.equal(&b ) 更改为 a==b 即可。有关《查找两个List中的不同元素》的问题解答与编程实践 - 推酷
有关《查找两个List中的不同元素》的问题解答与编程实践
有List&String& list1和List&String& list2,两个集合各有上万个元素,怎样查找两个集合中不同的元素呢?
问题分析:
由于每个list中都有上万个元素,如果用简单的遍历查找算法,那么至少需要次判断比较。显然,这样做的效率极低。那么有没有比较好的方案呢?经过我的思考,想出了2个办法。请大家评判。
方法一:遍历算法的改进算法
思路:对每一个list1中的元素,都在list2中查找一下,是否重复,如果不重复,则将该元素放到listDiff中。如果重复,则将该元素从list2中剔除。这样,能够减少遍历算法的时间复杂度,而且重复元素越多,该改进算法的运行时间就越短。当然,如果两个list的重复元素个数远远小于list的长度,则该算法的时间复杂度和遍历算法近似相同,会变的很慢而不切实际。
方法二:利用Map中无重复元素的特性
思路:将list1中元素首先复制到map&String,Integer&中,并将其Integer的值设置为1.然后再对list2中的元素,与map中元素比较。如果map中已经存在该String,那么map中对应String的Integer加1(表示字符串出现的次数),如果map中不存在,那么就将其复制到map中,并设置其Integer为1.那么,map中Integer值为1的元素所对应的String,就是两个list中不同的元素。
以下代码是在Java中实现,也可以用C++ STL进行测试。
import java.util.ArrayL
import java.util.HashM
import java.util.L
import java.util.M
*@author: ZhengHaibo
Nanjing,Conris,China
public class TestMian {
private static final int ListLen = 10000;// 设置list的长度
private static final Integer flagUnique = 1;//无重复字符串的键值
public List&String& list1 = new ArrayList&String&();
public List&String& list2 = new ArrayList&String&();
public static void main(String[] args) {
// TODO Auto-generated method stub
TestMian mTest=new TestMian();
mTest.initList();
List&String& listDiff1=mTest.getDiffElementUseEach(mTest.list1,mTest.list2);//获得不同元素
mTest.initList();
List&String& listDiff2=mTest.getDiffElementUseMap(mTest.list1,mTest.list2);//获得不同元素
System.out.println(&The number of diff element is: &+listDiff1.size());
System.out.println(&The number of diff element is: &+listDiff2.size());
//mTest.printList(listDiff1);
//mTest.printList(listDiff2);
// 初始化list中的元素,并保证有相同的元素
public void initList() {
list1.clear();
list2.clear();
for (int i = 0; i & ListL i++) {
list1.add(&conris_list_of& + i + &test&);
list2.add(&conris_list_of& + 3 * i + &test&);
//获得连个list中的不同元素,查找删除法
public List&String& getDiffElementUseEach(List&String& list1,List&String& list2) {
System.out.println(&-----------------------方法1----------------------&);
long runtime = System.nanoTime();// 开始计时
List&String& diffList = new ArrayList&String&();// 用于保存两个list中不同的元素
for (String string:list1) {//消除list1本身的重复元素
int index=list2.indexOf(string);
if (index==-1) {//说明list2中不存在此元素
diffList.add(string);
}else{//list2存在此元素,那么删除此元素
list2.remove(index);
for(String string:list2){//此时,liat2中的重复元素已经删除了,只需要复制到diffList中即可
diffList.add(string);
System.out.println(&getDiffElementUseRemove run time:&
+ (System.nanoTime() - runtime));
return diffL
//获得两个list中的不同元素,map方法
public List&String& getDiffElementUseMap(List&String& list1,List&String& list2){
System.out.println(&-----------------------方法2----------------------&);
long runtime = System.nanoTime();//开始计时
//利用map中不能有重复元素的特点
Map&String, Integer& map = new HashMap&String,Integer&(list1.size()+ list2.size());
List&String& diffList = new ArrayList&String&();//用于保存两个list中不同的元素
for (String string : list1) {
map.put(string,flagUnique);//先将list1中元素复制到map中保存
for (String string : list2) {
Integer key = map.get(string);// 获得键值
if (key != null) {//如果map中已经存在该元素,说明list1中存在该元素,那么将其key加1
map.put(string, ++key);
}else{//如果不存在,则放入map中
map.put(string,flagUnique);
for (Map.Entry&String, Integer& entry : map.entrySet()){
if (entry.getValue() == flagUnique)//在map中,键值为flagUnique的元素即为无重复的元素
diffList.add(entry.getKey());
System.out.println(&getDiffElementUseMap run time:&
+ (System.nanoTime() - runtime));
return diffL
public void printList(List&String& list){
for(int i=0;i&list.size();i++){
System.out.println(list.get(i));
实验结果:
当ListLen设置为10000时:
-----------------------方法1----------------------
getDiffElementUseRemove run time:
-----------------------方法2----------------------
getDiffElementUseMap run time:
The number of diff element is: 13332
The number of diff element is: 13332
当ListLen设置为100000时:等了半天方法1没有运行出来结果,方法2的运行结果如下:
-----------------------方法2----------------------
getDiffElementUseMap run time:
The number of diff element is: 133332
可见当数据量达到100000时(增大10倍),方法二仍然可以工作,而且时间也随着数据量增大线性增加。
而方法1很久也没有运行出来结果…
由此可见,利用HashMap的方法速度更快,能够满足基本要求。不知道大家还有哪些想法可以交流交流。希望对大家有帮助。
PS:如果用C++ STL实现的话,运行速度将更快!没事的时候再试试~~
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致如何比较2个List中相同的元素 - ITeye问答
现在根据条件进行了查询,封装到了2个List中,如何比较2个List中是否有相同的呢? 总是返回false,还请各位指点迷津~ 谢谢
public class Menu implements Serializable {
* 重写equals
public boolean equals(Object obj) {
if (this == obj)
if (obj == null)
if (getClass() != obj.getClass())
final Menu other = (Menu)
if (this.getId() != other.getId())
public String getId() {
public void setId(String id) {
public String getParentcode() {
public void setParentcode(String parentcode) {
this.parentcode =
public String getText() {
public void setText(String text) {
this.text =
public void compareList(List&Menu& menulist,List&Menu& grantList){
for(int i=0;i&grantList.size();i++){
Menu gmenu=grantList.get(i);
if(menulist.contains(gmenu)){
System.out.println("OK"+gmenu.getText());
问题补充:&div class="quote_title"&Dxx23 写道&/div&&div class="quote_div"&&div class="quote_title"&引用&/div&&div class="quote_div"& if (getClass() != obj.getClass()) &/div&
&br /&上面这个你写错了吧?
&br /&应该是
&br /&&pre name="code" class="java"&
&&& if (this.getClass() != obj.getClass())
&/pre&&/div&
&br /&
&br /&
&br /&不是这里的问题~ 不过还是谢谢你 ~
问题补充:&div class="quote_title"&william_ai 写道&/div&&div class="quote_div"&重写hashCode()方法&/div&
&br /& 请问具体的怎么写?谢谢
lz是指
引用if(menulist.contains(gmenu))
这一行,menulist中包含有与gmenu一样id的对象,但结果返回false吗?
我在我本地模拟了一些数据,调用lz的代码是可以正常打出ok的哦。
建议可以在equals的各个分支里打印一下比较双方的信息,或者debug一下,看看到底是什么原因导致返回false的。
看了一下jdk的源码和文档,Collection的contains方法,最终是调equals方法来判断两个对象是否相等的,所以重点考察一下equals方法吧。
引用Returns true if this collection contains the specified element. More formally, returns true if and only if this collection contains at least one element e such that (o==null ? e==null : o.equals(e)).
没好办法。
因为你的对象没有多少字段,数据在少点的话,可以这么写:
for(Menu a :menulist)
for(Menu b : grantList)
&&& if(a.getId()==b.getId()
在有你查查BeanUtils类是否有什么方法可用得到的。
重写hashCode()方法
引用 if (getClass() != obj.getClass())
上面这个你写错了吧?
应该是
if (this.getClass() != obj.getClass())
只能把内容拿出来比 没别的法子
已解决问题
未解决问题判断两个list集合中元素是否相同[code=Java][/code]有没有一种很简单的方法判断两个list集合中元素存在相同的。只要存在就返回true.我实在是不想取出单个元素去比较!
Collections.disjoint(Collection& & c1, Collection& & c2)&
如果两个指定 collection 中没有相同的元素,则返回 true。
itpentiuman
回答2:或者list.retainAll后 判断size与原来相同否。

我要回帖

更多关于 比较两个list相同元素 的文章

 

随机推荐