获取两个List中的不同元素,4种方法,逐步优化,学习使用
完全复制https://www.cnblogs.com/czpblog/archive/2012/08/06/2625794.html
先上测试结果
代码
package com.syl.test; import java.util.*; /**
* 获取两个List的不同元素(假设List自身不存在重复元素)
* Created by syl on 2017/12/26 0026.
*/
public class TestCompareList {
public static void main(String[] args) {
List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();
for (int i = 0; i < 30000; i++) {
list1.add("test" + i);
}
for (int i = 0; i < 80000; i++) {
list2.add("test" + i * 2);
} getDiffrent1(list1, list2);
getDiffrent2(list1, list2);
getDiffrent3(list1, list2);
getDiffrent4(list1, list2);
} // 方法1,两层遍历查找,遍历次数为list1.size()*list2.size(),有点蠢
private static List<String> getDiffrent1(List<String> list1, List<String> list2) {
// diff 存放不同的元素
List<String> diff = new ArrayList<String>();
// 开始查找的时间,用于计时
long start = System.currentTimeMillis();
for (String str : list1) {
if (!list2.contains(str)) {
diff.add(str);
}
}
// 计时
System.out.println("方法1 耗时:" + (System.currentTimeMillis() - start) + " 毫秒");
return diff;
} // 方法2,两层遍历查找,用retainAll()方法查找,也很蠢,方法底层依旧是两层遍历
private static List<String> getDiffrent2(List<String> list1, List<String> list2) {
long start = System.currentTimeMillis();
list1.retainAll(list2);// 返回值是boolean
System.out.println("方法2 耗时:" + (System.currentTimeMillis() - start) + " 毫秒");
return list1;
} // 方法3,用Map存放List1和List2的元素作为key,value为其在List1和List2中出现的次数
// 出现次数为1的即为不同元素,查找次数为list1.size() + list2.size(),较方法1和2,是极大简化
private static List<String> getDiffrent3(List<String> list1, List<String> list2) {
List<String> diff = new ArrayList<String>();
long start = System.currentTimeMillis();
Map<String, Integer> map = new HashMap<String, Integer>(list1.size() + list2.size());
// 将List1元素放入Map,计数1
for (String string : list1) {
map.put(string, 1);
}
// 遍历List2,在Map中查找List2的元素,找到则计数+1;未找到则放入map,计数1
for (String string : list2) {
Integer count = map.get(string);
if (count != null) {
map.put(string, ++count);// 此处可优化,减少put次数,即为方法4
continue;
}
map.put(string, 1);
}
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() == 1) {
diff.add(entry.getKey());
}
}
System.out.println("方法3 耗时:" + (System.currentTimeMillis() - start) + " 毫秒");
return diff;
} // 优化方法3,减少put次数
private static List<String> getDiffrent4(List<String> list1, List<String> list2) {
List<String> diff = new ArrayList<String>();
long start = System.currentTimeMillis();
Map<String, Integer> map = new HashMap<String, Integer>(list1.size() + list2.size());
List<String> maxList = list1;
List<String> minList = list2;
if (list2.size() > list1.size()) {
maxList = list2;
minList = list1;
}
for (String string : maxList) {
map.put(string, 1);
}
for (String string : minList) {
Integer count = map.get(string);
if (count != null) {
map.put(string, ++count);
continue;
}
map.put(string, 1);
}
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() == 1) {
diff.add(entry.getKey());
}
}
System.out.println("方法4 耗时:" + (System.currentTimeMillis() - start) + " 毫秒");
return diff; } }
获取两个List中的不同元素,4种方法,逐步优化,学习使用的更多相关文章
- Python编程系列---获取请求报文行中的URL的几种方法总结
在浏览器访问web服务器的时候,服务器收到的是一个请求报文,大概GET请求的格式大概如下: 先随便拿到一个请求报文,蓝色即为我们要获取的 GET /index.html HTTP/1.1 Hos ...
- 有关《查找两个List中的不同元素》的问题解答与编程实践
郑海波 2013-07-08 问题: 有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样查找两个集合中不同的元素呢? ...
- javascript 常见数组操作( 1、数组整体元素修改 2、 数组筛选 3、jquery 元素转数组 4、获取两个数组中相同部分或者不同部分 5、数组去重并倒序排序 6、数组排序 7、数组截取slice 8、数组插入、删除splice(需明确位置) 9、数组遍历 10、jQuery根据元素值删除数组元素的方)
主要内容: 1.数组整体元素修改 2. 数组筛选 3.jquery 元素转数组 4.获取两个数组中相同部分或者不同部分 5.数组去重并倒序排序 6.数组排序 7.数组截取slice 8.数组插入.删除 ...
- php获取两个数组相同的元素(交集)以及比较两个数组中不同的元素(差集)
(一)php获取两个数组相同元素 array array_intersect(array $array1, array $array2, [, array $...]) array array_ ...
- Java - Collection 高效的找出两个List中的不同元素
如题:有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样取出两个集合中不同的元素? 方法1:遍历两个集合 public ...
- java中获取两个时间中的每一天
引入下面方法即可: /** * 获取两个时间中的每一天 * @param bigtimeStr 开始时间 yyyy-MM-dd * @param endTimeStr 结束时间 yyyy-MM-dd ...
- Java Collection - 003 高效的找出两个List中的不同元素
如题:有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样取出两个集合中不同的元素? 方法1:遍历两个集合 public ...
- JS[获取两个日期中所有的月份]
//------[获取两个日期中所有的月份中] function getMonthBetween(start,end){ var result = []; var s = start.split(&q ...
- 【Java】获取两个字符串中最大相同子串
题目 获取两个字符串中最大相同子串 前提 两个字符串中只有一个最大相同子串 解决方案 public class StringDemo { public static void main(String[ ...
随机推荐
- 提示缺少python.h解决办法
在安装uwsgi时,提示缺少python.h In file included :: plugins/python/uwsgi_python.h::: fatal error: Python.h: N ...
- asp.net core + 前端H5 页面视频站制作尝试
.net core 2.1出来一段时间了,一直关注,前周花了半天时间学习了一下,特制作了一个视频小站(欢迎扫码体验): 页面首页效果如下: 播放页面效果如下: 部分代码: using ENT.IBLL ...
- MVC ASP.NET MVC5使用Area区域
MVC ASP.NET MVC5使用Area区域 一.为什么要使用area? 在大型的ASP.NET mvc5项目中一般都有许多个功能模块,这些功能模块可以用Area(中文翻译为区域)把它们分离开来 ...
- 阿里云PolarDB及其共享存储PolarFS技术实现分析(上)
PolarDB是阿里云基于MySQL推出的云原生数据库(Cloud Native Database)产品,通过将数据库中计算和存储分离,多个计算节点访问同一份存储数据的方式来解决目前MySQL数据库存 ...
- 二十三、MongoDb 数据库介绍、安装、启动和连接(非关系型数据库)
1.数据库和文件的主要区别 1. 数据库有数据库表.行和列的概念,让我们存储操作数据更方便2. 数据库提供了非常方便的接口,可以让 nodejs.php java .net 很方便的实现增加修改删除功 ...
- VMware Workstation内存不足问题的解决!
我今天使用VMware Workstation,遇到内存使用不足的问题,我使用的VMware Workstation是9,刚开始我以为是我的VMware Workstation版本低,所以上网找到了V ...
- chipmunk 物理引擎的基本概念和基本用法
chipmunk是一个开源2D物理引擎, 项目主页:http://code.google.com/p/chipmunk-physics/ 工作需要研究了一下,这个引擎的资料还是不多,我阅读了所有的文档 ...
- repo搭建
[root@op-yum01]# cat /home/work/yumdata/rsync-reposync.sh #!/bin/bash #Purpose: Sync centos7 repos v ...
- BAT机器学习面试1000题系列(41-45题)
41.线性分类器与非线性分类器的区别以及优劣 如果模型是参数的线性函数,并且存在线性分类面,那么就是线性分类器,否则不是.常见的线性分类器有:LR,贝叶斯分类,单层感知机.线性回归常见的非线性分类器: ...
- 阿里java开发规范学习(附P3C IDEA插件 帮助规范的养成)
浅析 阿里巴巴 Java 开发规约 (未完成) 更加优秀的页面展现请到浅析 阿里巴巴 Java 开发规约 contents 为什么要学 编程规约 P3C IDEA 插件 why-use 我们知道,一般 ...