import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.TreeSet; /**
* @author 马家立
* @version 创建时间是:2019年8月16日上午9:35:11
* @Description:TODO List去重比较
*/
public class listRemoveDuplicate {
/**
* @Title:removeDuplicateByHashSet
* @author:马家立
* @date:2019年9月18日
* @Description:TODO 方式1:HashSet无序去重
* @param <E>
* @param list
* void
*/
public static <E> void removeDuplicateByHashSet(List<E> list) {
// 初始化HashSet对象
HashSet<E> set = new HashSet<E>();
List<E> result = new ArrayList<E>();
for (E e : result) {
if (set.add(e)) {
result.add(e);
}
}
// 把List集合所有元素清空
list.clear();
// 把HashSet对象添加至List集合
list.addAll(result);
} /**
* @Title:removeDuplicateByLinkedHashSet
* @author:马家立
* @date:2019年9月18日 @Description:TODO 方式2:LinkedHashSet有序去重
* @param <E>
* @param list
* void
*/
public static <E> void removeDuplicateByLinkedHashSet(List<E> list) {
// 初始化LinkedHashSet对象,并把list对象元素赋值给LinkedHashSet对象
LinkedHashSet<E> set = new LinkedHashSet<E>(list);
// 把List集合所有元素清空
list.clear();
// 把LinkedHashSet对象添加至List集合
list.addAll(set);
} /**
* @Title:removeDuplicateByTreeSet
* @author:马家立
* @date:2019年9月18日 @Description:TODO 方式3:TreeSet去重
* @param <E>
* @param list
* void
*/
public static <E> void removeDuplicateByTreeSet(List<E> list) {
// 初始化TreeSet对象,并把list对象元素赋值给TreeSet对象
TreeSet<E> treeSet = new TreeSet<E>(list);
// 把List集合所有元素清空
list.clear();
// 把TreeSet对象添加至List集合
list.addAll(treeSet);
} /**
* @Title:removeDuplicateByEquals
* @author:马家立
* @date:2019年9月18日 @Description:TODO 方式4:双重for_iterate循环_equals_remove去重
* @param <E>
* @param list
* void
*/
public static <E> void removeDuplicateByEquals(List<E> list) {
for (int i = 0; i < list.size(); i++) {
for (int j = i + 1; j < list.size(); j++) {
if (list.get(i).equals(list.get(j))) {
list.remove(j);
}
}
}
} /**
* @Title:removeDuplicateByContains1
* @author:马家立
* @date:2019年9月18日
* @Description:TODO 方式5:forEach方式循环_contains去重
* @param <E>
* @param list
* void
*/
public static <E> void removeDuplicateByContains1(List<E> list) {
List<E> result = new ArrayList<E>();
for (E e : list) {
if (!result.contains(e)) {
result.add(e);
}
}
// 把List集合所有元素清空
list.clear();
// 把所有对象添加至List集合
list.addAll(result);
} /**
* @Title:removeDuplicateByContains2
* @author:马家立
* @date:2019年9月18日 @Description:TODO 方式6:list.stream()方式循环_contains去重
* @param <E>
* @param list
* void
*/
public static <E> void removeDuplicateByContains2(List<E> list) {
List<E> result = new ArrayList<E>(list.size());
list.stream().forEach(p -> {
if (!result.contains(p)) {
result.add(p);
}
});
} public static void main(String[] args) {
// 声明List
final List<String> list = new ArrayList<String>();
// List添加数据
for (int i = 0; i < 1000; i++) {
if (0 == (i % 50)) {
list.add("我是皮卡兵");
} else if (0 == (i % 25)) {
list.add("我是皮卡乒");
} else if (0 == (i % 10)) {
list.add("我是皮卡乓");
} else if (0 == (i % 5)) {
list.add("我是皮卡皮");
} else {
list.add("我是第-" + i + "个皮卡丘");
}
list.add("哇咔哇,电光一闪");
}
List<String> list1 = list;
List<String> list2 = list;
List<String> list3 = list;
List<String> list4 = list;
List<String> list5 = list;
List<String> list6 = list;
// 循环次数
int forTimes = 100;
// 纳秒级别
long time = System.nanoTime(); // 方式一
for (int i = 0; i < forTimes; i++) {
removeDuplicateByHashSet(list1);
}
long time1 = System.nanoTime();
System.out.println("方式1:HashSet无序去重的时间是:\t" + ((time1 - time)) + "纳秒"); // 方式二
for (int i = 0; i < forTimes; i++) {
removeDuplicateByLinkedHashSet(list2);
}
long time2 = System.nanoTime();
System.out.println("方式2:LinkedHashSet有序去重的时间是:\t" + ((time2 - time1)) + "纳秒"); // 方式三
for (int i = 0; i < forTimes; i++) {
removeDuplicateByTreeSet(list3);
}
long time3 = System.nanoTime();
System.out.println("方式3:TreeSet去重的时间是:\t" + ((time3 - time2)) + "纳秒"); // 方式四
for (int i = 0; i < forTimes; i++) {
removeDuplicateByEquals(list4);
}
long time4 = System.nanoTime();
System.out.println("方式4:双重for_iterate循环_equals_remove去重的时间是:\t" + ((time4 - time3)) + "纳秒"); // 方式五
for (int i = 0; i < forTimes; i++) {
removeDuplicateByContains1(list5);
}
long time5 = System.nanoTime();
System.out.println("方式5:forEach方式循环_contains去重的时间是:\t" + ((time5 - time4)) + "纳秒"); // 方式六
for (int i = 0; i < forTimes; i++) {
removeDuplicateByContains2(list6);
}
long time6 = System.nanoTime();
System.out.println("方式6:list.stream()方式循环_contains去重的时间是:\t" + ((time6 - time5)) + "纳秒"); }
}

结果:

方式1:HashSet无序去重的时间是:    330200纳秒
方式2:LinkedHashSet有序去重的时间是: 660500纳秒
方式3:TreeSet去重的时间是: 758700纳秒
方式4:双重for_iterate循环_equals_remove去重的时间是: 37300纳秒
方式5:forEach方式循环_contains去重的时间是: 146900纳秒
方式6:list.stream()方式循环_contains去重的时间是: 41510900纳秒

List去重比较的更多相关文章

  1. JavaScript常见的五种数组去重的方式

    ▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...

  2. 数组去重 JS

    我说的数组去重是这样的: var arr = ['f', 'a',  'b', 'd', 'e', 'g']  ; var str='f'; 去除arr中的str 最简单的是遍历arr与str做比较, ...

  3. [Algorithm] 使用SimHash进行海量文本去重

    在之前的两篇博文分别介绍了常用的hash方法([Data Structure & Algorithm] Hash那点事儿)以及局部敏感hash算法([Algorithm] 局部敏感哈希算法(L ...

  4. JS去重及字符串奇数位小写转大写

    面试中经常会考到数组的去重.作为一名合格的前端开发者,不知道几种去重方法是在不应该.废话不多说直接开撸-- 一.indexOf()方法 实现思路:使用indexOf()方法来判断新数组中是否有这个值, ...

  5. js数组去重

    这就是数组去重了...var str=['hello','node','element','node','hello','blue','red'];var str1=[]; function firs ...

  6. [Hadoop]-从数据去重认识MapReduce

    这学期刚好开了一门大数据的课,就是完完全全简简单单的介绍的那种,然后就接触到这里面最被人熟知的Hadoop了.看了官网的教程[吐槽一下,果然英语还是很重要!],嗯啊,一知半解地搭建了本地和伪分布式的, ...

  7. 1.uniq去重命令讲解

    uniq命令: 常见参数: -c,--count *****      在每行旁边显示改行重复出现的次数 -d,--repeated        仅显示重复出现的行,2次或2次以上的行,默认的去重包 ...

  8. python list dict 去重的两种方式

    def dedupe(items, key=None): seen = set() for item in items: val = item if key is None else key(item ...

  9. js给数组去重写法

    数组为 var list =['A','B','A']; 法一:常规做法,新建list,给list添加元素,添加前判断是否包含 var removeRepeatItem = function(list ...

  10. 分享一种容易理解的js去重排序方法

    <script> var arr=[1,8,6,4,88,22,99,4,6,86,5,58,89,5]; //先使用sort()函数去重 var a=arr.sort(function ...

随机推荐

  1. OpenGL学习(3)——Shader(补)

    完成章节后练习. 练习 1. Adjust the vertex shader so that the triangle is upside down. #version 330 core layou ...

  2. Centos7 yum源配置及关闭防火墙

    清理源 #yum clean all更新源缓存 #yum makecache更新源 #yum update 设置主机名: #hostnamectl set-hostname 查看防火墙状态 #syst ...

  3. 洛谷P2604 最大流+最小费用最大流

    题目链接:https://www.luogu.org/problem/P2604 题目描述 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在 ...

  4. 《C和指针》读书笔记

    1. 三字母词 三字母词即用三个字符合起来表示另一个字符,它可以使C环境在某些缺少一些必需字符的字符集上实现. ??( [ ??< { ??= # ??) ] ??> } ??/ \ ?? ...

  5. [转帖]yaml语言格式

    yaml语言格式 YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言),强调这种语言以数据做为中心,而不是以置标语言为重点. 转载2篇 ...

  6. Kubernetes---Pod笔记

    ⒈pod的理解     将多个容器镜像融合在一起,共享网络命名空间及容器卷 ⒉pod的分类 自助式podv          不是被控制器管理的pod,它一旦死亡不会被人给拉起来. 控制器管理的pod ...

  7. 【计算机网络】-传输层-Internet传输协议-TCP

    [计算机网络]-传输层-Internet传输协议-TCP TCP介绍 在不可靠的互联网上提供一个可靠的端到端字节流 面向连接的.可靠的.端到端的.基于字节流的传输协议 TCP位置 TCP服务模型 应用 ...

  8. 创建web服务器

    用node创建本地web服务 1,创建本地文件server.js var http = require('http'); var url=require('url'); var fs=require( ...

  9. hdu 6082 2017百度之星资格赛

    #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #inclu ...

  10. WebApi 空项目生成帮助文档

    1.创建一个WebApi的空项目 2.写一些接口,在接口文档中忽略某个方法可以使用  [ApiExplorerSettings(IgnoreApi = true)] 特性 3.在Nuget中添加 Mi ...