Java之List集合

​上个星期,我碰到了一个非常头疼的问题,因为我需要找出两个List集合中的[交集的补集],也就是说,找出他们中互相都不拥有的元素,这个问题看起来似乎很简单。但是做起来其实不然,我在网上搜了很多资料,有用各种各样的方法解决的。可是我也在想,这个问题真的有那么难么,那么今天我就来讲一下,我是如何解决这个问题的 —— 如何找出两个List集合中的交集的补集?我           相信把这个问题解决了,交集,补集,并集什么的....都不是问题了!

前期思路

首先,我们得来准备连个List集合的对象,list1和list2假设他们里面的数据是String类型的(这个方法不仅适合于String类型的数据,还可以是其他类型,这里就以String类型为栗子了)。

其次,我们来个它们分别添加一些数据,为了简单易懂,我就添加一些比较简单的类型的数据了,list一中的数据为:"小王","老王","隔壁老王","老湿机";list2中的数据为:"小王","老王","隔壁老王","老司机"。

最后,按照这个数据来的话,我们的任务就是把两个“司机”给它揪出来,因为list1中没有"老司机",list2中没有"老湿机"。

ok,任务拿到。那么这不就是equals的精妙使用吗。一个个比呗,首先我们用list1中的"小王"来和list2中的所有元素进行equals对比,如果相等了,那接下来怎么办呢。肯定不能直接把它remove掉。那就break这个循环,不用理会它了,因为我们的目标不是他。"老王"和"隔壁老王"也一样,最后来到"老湿机"这个位置,咦,他居然没有找到一个与自己相同的人,那么我们就得把他拿出来单独放起来了,那这个时候,我们就得准备一个临时的List集合把他装起来了。好了,思路很清晰,我们先来把第一阶段的想法实施一下。

第一阶段代码实现

packagecom.asen.container;

importjava.util.ArrayList;

importjava.util.List;

publicclassListDemo{

//新建一个方法disnitersection,便于后续的使用

publicListdisnitersection(Listl1,Listl2){

Listtemplist=newArrayList<>();// 首先准备一个tempList来存放找出来的数据,便于返回

//让list1中的每个元素去和list2中的每个元素做对比,如果不相同就把他加入到临时的集合中,最后返回

for(Strings1:l1){

for(Strings2:l2){

if(s1.equals(s2)){

break;//如果相同则直接寻找下一个

}else{

templist.add(s1);//将不同的元素加入临时templist中

}

}

}

returntemplist;

}

publicstaticvoidmain(String[]args){

ListDemold=newListDemo();//创建对象

Listl1=newArrayList<>();//创建需要对比的list1

Listl2=newArrayList<>();//创建需要对比的list2

//像list1中添加数据

l1.add("小王");

l1.add("老王");

l1.add("隔壁老王");

l1.add("老湿机");

//像list2中添加数据

l2.add("小王");

l2.add("老王");

l2.add("隔壁老王");

l2.add("老司机");

//调用disnitersection方法对比

Listlist=ld.disnitersection(l1,l2);

for(Strings:list){

System.out.println(s);//输出不同结果

}

}

}

如果按照前面的思路走,那我们接下来输出的结果应该是"老湿机",因为每个list1中的元素和list2中的每个元素进行对比,那输出的肯定只有list1中我们想要的那个元素。我们先作但方面的测试。结果:“老湿机”......   但是,真正的结果却是这样的:   输出结果:老王,隔壁老王,隔壁老王,老湿机,老湿机,老湿机,老湿机   可以看到,这个结果是完全出乎我们的意料啊。不过仔细观察可以发现其中的问题,当list1第一个元素“小王”去和list2中的元素对比的时候,碰巧list2中的第一个元素“也是小王”,所以直接break掉,完全没问题,但是当list1中的第二个元素“老王”来和list2中的元素对比,原来他也是从第一个开始对比着走,结果发现第一个元素“小王”就和自己不一样,所以他就这样被保存到了临时templist中了,这就是问题的所在,后面的也是一样,“老湿机”来对比了list2中的四个元素,结果没有发现一个和自己一样的,所以他就这样被保存了四遍。   那么现在的问题同样也很清晰了,就是说,我们需要在对比不同的情况下,不要立即打断对比并将其加入到templist中,因为就算前面的都不一样,但是最后一个是一样的,这样的情况也需要考虑进去。

中期问题

虽然问题是很明确了,但是我们要怎么去解决这个问题呢?在不同的情况下,继续对比,直到找到相同的才能结束,或者找完全部也没有找到后被加进templist。就是这个地方,让我绞尽脑汁,连洗澡都在想,这个问题怎么解决,最后我实在没办法了,所以拿出笔拿出纸,开始画,因为画图总会给我们带来新的思路。果不其然,有重大发现!!!

我画图后发现,就拿list1的最后一个元素“老湿机”来举栗子,当他把list2中的所有元素都找完后都没有发现和自己一样的元素,那么我们就有了一个解题的线索:因为只要是交集的补集都不会再对方那里找到和自己一样的元素,所以他们都会找遍对方所有的元素后发现没有和自己一样的元素,这就说明,他们找的次数和对方的元素个数是相同的,换句话说,当他们对比的次数和对方的元素个数一样多的时候,那就已经可以说明,它肯定就是我们要找的那个元素了。那么接下来的问题就简单了,我们用代码来实践一下我们的想法:

//新建一个方法disnitersection,便于后续的使用

publicListdisnitersection(Listl1,Listl2){

// 首先准备一个tempList来存放找出来的数据,便于返回

Listtemplist=newArrayList<>();

intcount=0;//记录对比的次数

//让list1中的每个元素去和list2中的每个元素做对比,如果不相同就把他加入到临时的集合中,最后返回

for(Strings1:l1){

for(Strings2:l2){

if(s1.equals(s2)){

//此时count同样需要清零

count=0;

break;

}else{

//否则就说明没有找到相同的,将寻找的次数记下来

count++;

}

if(count==l2.size()){

//当发现对比的次数等于list2的长度(或者大小)时,则说明这是我们需要找的元素

templist.add(s1);

count=0;

}

}

}

returntemplist;

}

当我们在之前代码的基础上把方法里的条件加上我们的判断条件之后,惊奇的发现,输出结果果然是“老湿机”,对了,就是这样的,这样就可以找出两个List集合中的“交集的补集”了,当然以上的代码是单方面的,另一方面把中间的两个for循环调换一遍在放到下面,就可以得到我们想要的结果了。

packagecom.asen.container;

importjava.util.ArrayList;

importjava.util.List;

/**

* @author Asen

*

*/

publicclassTest{

publicstaticListdisnitersection(Listl1,Listl2){

Listlist=newArrayList<>();// 存储需要返回的List

intcount=0;// 记录对比的次数

if(l1.equals(l2)){

list.add("null");

}else{

// 把第一个List中的每个元素和第二个List中的每个元素中对比

for(Stringmax:l2){

for(Stringmin:l1){

if(max.compareTo(min)==0){// 当发现两个List中有同样的元素时,则就直接清零count,并继续寻找下一个元素

count=0;

break;

}else{// 当第一个中的一个元素与第二个中对比

count++;

}

if(count==l1.size()){

list.add(max);

count=0;

}

}

}

for(Stringmax:l1){

for(Stringmin:l2){

if(max.compareTo(min)==0){// 当发现两个List中有同样的元素时,则就直接清零count,并继续寻找下一个元素

count=0;

break;

}else{// 当第一个中的一个元素与第二个中对比

count++;

}

if(count==l2.size()){

list.add(max);

count=0;

}

}

}

}

returnlist;

}

publicstaticvoidmain(String[]args){

Listl1=newArrayList<>();

Listl2=newArrayList<>();

l1.add("小王");

l1.add("老王");

l1.add("隔壁老王");

l1.add("老湿机");

l2.add("小王");

l2.add("老王");

l2.add("隔壁老王");

l2.add("老司机");

l2.add("我是不一样的!!!");

l2.add("我也是不一样的,咯咯咯!!!");

Listtest=Test.disnitersection(l1,l2);

for(StringString:test){

System.out.println(String);

}

}

}

在考虑进去两个集合完全完全相等等情况下,我们的完整代码就是以上那个样子了。个人觉得这个方法简单很多,但是同时也有很多不足之处,比如说当泛型里面是一下不支持equals和CompareTo等方法的时候还需要自己去改,去修正。

PS:以共享IT资源,畅游IT为核心组成的海贼团每周不定期推送更新完整的项目文章详解,欢迎加入IT海贼船!

黑胡子:人的梦想,永远不会结束!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341

推荐阅读更多精彩内容