知识大全 高效的找出两个List中的不同元素

Posted 元素

篇首语:历览千载书,时时见遗烈。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 高效的找出两个List中的不同元素相关的知识,希望对你有一定的参考价值。

高效的找出两个List中的不同元素  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

    如题 有List<String> list 和List<String> list 两个集合各有上万个元素 怎样取出两个集合中不同的元素?    方法 :遍历两个集合         package czp test;import java util ArrayList;import java util List;public class TestList         public static void main(String[] args)         List<String> list = new ArrayList<String>()         List<String> list = new ArrayList<String>()         for (int i = ; i < ; i++)         list add( test +i)         list add( test +i* )                 getDiffrent(list list )         //输出 total times                 /**        * 获取连个List的不同元素        * @param list                 * @return        */        private static List<String> getDiffrent(List<String> list List<String> list )         long st = System nanoTime()         List<String> diff = new ArrayList<String>()         for(String str:list )                if(!ntains(str))                diff add(str)                         System out println( total times +(System nanoTime() st))         return diff;                千万不要采用这种方法 总共要循环的次数是两个List的size相乘的积 从输出看耗时也是比较长的 那么我们有没有其他的方法呢?当然有     方法 :采用List提供的retainAll()方法         package czp test;import java util ArrayList;import java util List;public class TestList         public static void main(String[] args)         List<String> list = new ArrayList<String>()         List<String> list = new ArrayList<String>()         for (int i = ; i < ; i++)         list add( test +i)         list add( test +i* )                 getDiffrent(list list )         //输出 total times         getDiffrent (list list )         //输出 getDiffrent total times                 /**        * 获取连个List的不同元素        * @param list         * @param list         * @return        */        private static List<String> getDiffrent (List<String> list List<String> list )         long st = System nanoTime()         list retainAll(list )         System out println( getDiffrent total times +(System nanoTime() st))         return list ;                /**        * 获取连个List的不同元素        * @param list         * @param list         * @return        */        private static List<String> getDiffrent(List<String> list List<String> list )         long st = System nanoTime()         List<String> diff = new ArrayList<String>()         for(String str:list )                if(!ntains(str))                diff add(str)                         System out println( getDiffrent total times +(System nanoTime() st))         return diff;                很遗憾 这种方式虽然只要几行代码就搞定 但是这个却更耗时 查看retainAll()的源码         public boolean retainAll(Collection<?> c)         boolean modified = false;        Iterator<E> e = iterator()         while (e hasNext())         if (!ntains(e next()))         e remove()         modified = true;                        return modified;                无需解释这个耗时是必然的 那么我们还有没有更好的办法呢?仔细分析以上两个方法中我都做了mXn次循环 其实完全没有必要循环这么多次 我们的需求是找出两个List中的不同元素 那么我可以这样考虑 用一个map存放lsit的所有元素 其中的key为lsit 的各个元素 value为该元素出现的次数 接着把list 的所有元素也放到map里 如果已经存在则value加 最后我们只要取出map里value为 的元素即可 这样我们只需循环m+n次 大大减少了循环的次数         package czp test;import java util ArrayList;import java util HashMap;import java util List;import java util Map;public class TestList         public static void main(String[] args)         List<String> list = new ArrayList<String>()         List<String> list = new ArrayList<String>()         for (int i = ; i < ; i++)         list add( test +i)         list add( test +i* )                 getDiffrent(list list )         //输出 total times         getDiffrent (list list )         //输出 getDiffrent total times         getDiffrent (list list )         //输出 getDiffrent total times                 /**        * 获取连个List的不同元素        * @param list         * @param list         * @return        */        private static List<String> getDiffrent (List<String> list List<String> list )         long st = System nanoTime()         Map<String Integer> map = new HashMap<String Integer>(list size()+list size())         List<String> diff = new ArrayList<String>()         for (String string : list )         map put(string )                 for (String string : list )         Integer cc = map get(string)         if(cc!=null)                map put(string ++cc)         continue;                map put(string )                 for(Map Entry<String Integer> entry:map entrySet())                if(entry getValue()== )                diff add(entry getKey())                         System out println( getDiffrent total times +(System nanoTime() st))         return list ;                /**        * 获取连个List的不同元素        * @param list         * @param list         * @return        */        private static List<String> getDiffrent (List<String> list List<String> list )         long st = System nanoTime()         list retainAll(list )         System out println( getDiffrent total times +(System nanoTime() st))         return list ;                /**        * 获取连个List的不同元素        * @param list         * @param list         * @return        */        private static List<String> getDiffrent(List<String> list List<String> list )         long st = System nanoTime()         List<String> diff = new ArrayList<String>()         for(String str:list )                if(!ntains(str))                diff add(str)                         System out println( getDiffrent total times +(System nanoTime() st))         return diff;                显然 这种方法大大减少耗时 是方法 的 / 是方法 的 / 这个性能的提升时相当可观的 但是 这不是最佳的解决方法 观察方法 我们只是随机取了一个list作为首次添加的标准 这样一旦我们的list 比list 的size大 则我们第二次put时的if判断也会耗时 做如下改进         package czp test;import java util ArrayList;import java util HashMap;import java util List;import java util Map;public class TestList         public static void main(String[] args)         List<String> list = new ArrayList<String>()         List<String> list = new ArrayList<String>()         for (int i = ; i < ; i++)         list add( test +i)         list add( test +i* )                 getDiffrent(list list )         getDiffrent (list list )         getDiffrent (list list )         getDiffrent (list list ) //        getDiffrent total times //        getDiffrent total times //        getDiffrent total times //        getDiffrent total times                 /**        * 获取连个List的不同元素        * @param list         * @param list         * @return        */        private static List<String> getDiffrent (List<String> list List<String> list )         long st = System nanoTime()         Map<String Integer> map = new HashMap<String Integer>(list size()+list size())         List<String> diff = new ArrayList<String>()         List<String> maxList = list ;        List<String> minList = list ;        if(list size()>list size())                maxList = list ;        minList = list ;                for (String string : maxList)         map put(string )                 for (String string : minList)         Integer cc = map get(string)         if(cc!=null)                map put(string ++cc)         continue;                map put(string )                 for(Map Entry<String Integer> entry:map entrySet())                if(entry getValue()== )                diff add(entry getKey())                         System out println( getDiffrent total times +(System nanoTime() st))         return diff;                /**        * 获取连个List的不同元素        * @param list         * @param list         * @return        */        private static List<String> getDiffrent (List<String> list List<String> list )         long st = System nanoTime()         Map<String Integer> map = new HashMap<String Integer>(list size()+list size())         List<String> diff = new ArrayList<String>()         for (String string : list )         map put(string )                 for (String string : list )         Integer cc = map get(string)         if(cc!=null)                map put(string ++cc)         continue;                map put(string )                 for(Map Entry<String Integer> entry:map entrySet())                if(entry getValue()== )                diff add(entry getKey())                         System out println( getDiffrent total times +(System nanoTime() st))         return diff;                /**        * 获取连个List的不同元素        * @param list         * @param list         * @return        */        private static List<String> getDiffrent (List<String> list List<String> list )         long st = System nanoTime()         list retainAll(list )         System out println( getDiffrent total times +(System nanoTime() st))         return list ;                /**        * 获取连个List的不同元素        * @param list         * @param list         * @return        */        private static List<String> getDiffrent(List<String> list List<String> list )         long st = System nanoTime()         List<String> diff = new ArrayList<String>()         for(String str:list )                if(!ntains(str))                diff add(str)                         System out println( getDiffrent total times +(System nanoTime() st))         return diff;                这里对连个list的大小进行了判断 小的在最后添加 这样会减少循环里的判断 性能又有了一定的提升 正如一位朋友所说 编程是无止境的 只要你认真去思考了 总会找到更好的方法! cha138/Article/program/Java/hx/201311/27046

相关参考

知识大全 Python如何改变列表内元素取值(使用回圈或list comprehension)

Python如何改变列表内元素取值(使用回圈或listcomprehension)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内

知识大全 算法大全-面试题-数据结构(收录)

一单链表目录单链表反转找出单链表的倒数第个元素找出单链表的中间元素删除无头单链表的一个节点两个不交叉的有序链表的合并有个二级单链表其中每个元素都含有一个指向一个单链表的指针写程序把这个二级链表称一级单

知识大全 .net中的List的使用

.net中的List的使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在开发称重软件过程中用

知识大全 Java中的Set,List,Map的区别

Java中的Set,List,Map的区别  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  对JA

知识大全 JAVA中的容器 list vector set map

JAVA中的容器listvectorsetmap  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 使用新的list分割方法提高灵活性

  Oraclei现在有两个方法可以完成分割range分割和新的list分割但是range分割需要标量数值而list分割允许使用非标量数值    要区分range分割和list分割让我们看一个简单的例

知识大全 list与iterator区别多双向关联配置

  对于Query接口的list()方法与iterator()方法来说都可以实现获取查询的对象但是list()方法返回的每个对象都是完整的(对象中的每个属性都被表中的字段填充上了)而iterator(

知识大全 找出身残志坚的两个人物事例

找出身残志坚的两个人物事例张海迪,1955年秋天在济南出生。5岁患脊髓病,胸以下全部瘫痪。从那时起,张海迪开始了她独到的人生。她无法上学,便在在家自学完中学课程。15岁时,海迪跟随父母,下放(山东)聊

知识大全 怎样快速找出两个excel表中相同的资料

怎样快速找出两个excel表中相同的资料用透视看计数项如果大于等于2肯定有重复,即相同资料:jingyan.baidu./article/f96699bbcf4fac894e3c1b1a.为了讲解的需

不同肥料元素与小麦生长的关系如何?

小麦在生长发育过程中除需要大气中的碳、氢、氧外,还需要消耗土壤中的氮、磷、钾、钙、镁、硫、铁、锰、锌、铜、钼、硼等元素。其中需要量和对产量影响较大的是氮、磷、钾三种元素,称为大量元素,其他称为微量元素