数组去重的方法java_五种数组去重方法的性能比较「建议收藏」

数组去重的方法java_五种数组去重方法的性能比较「建议收藏」为什么要写这篇文章之前参与面试一名外包程序员的时候,我要求他手写一个数组去重的方法,当时他使用了对象保存数值,通过查询去重。我表示表占用了空间,能不能只操作数组本身,减少空间占用。当时我想的是用indexOf和splice来操作数组,查询到index不等于i的时候,使用splice删除元素,之后自己跑了一遍发现函数执行时间非常长,所以想着研究一下效率比较高的去重方法。去重方法介…

大家好,又见面了,我是你们的朋友全栈君。

为什么要写这篇文章

之前参与面试一名外包程序员的时候,我要求他手写一个数组去重的方法,当时他使用了对象保存数值,通过查询去重。

我表示表占用了空间,能不能只操作数组本身,减少空间占用。

当时我想的是用 indexOf 和 splice 来操作数组,查询到 index 不等于 i 的时候,使用 splice 删除元素,之后自己跑了一遍发现函数执行时间非常长,所以想着研究一下效率比较高的去重方法。

去重方法介绍

外包同学写的表查询去重

//

function unique1(arr) {

let hash = {};

let result = [];

arr.forEach((num) => {

if (!hash[num]) {

hash[num] = 1;

result.push(num);

}

});

return result;

}

复制代码

思路:如果遍历到的数字不在表中,则更新表,更新结果数组。否则跳过

这个方法的优点是效率较高,缺点是占用了较多空间,可以看到使用的额外空间有一个查询对象和一个新的数组

ES6 的 Set 去重

function unique2(arr) {

return Array.from(new Set(arr));

}

复制代码

思路: 代码很简单,new 一个 Set,参数为需要去重的数组,Set 会自动删除重复的元素,再将 Set 转为数组返回。

这个方法的优点是效率更高,代码简单,思路清晰,缺点是可能会有兼容性问题

使用 filter 去重

function unique3(arr) {

return arr.filter((num, index) => {

return arr.indexOf(num) === index;

});

}

复制代码

思路: 这个方法与我上面面试时提到的思路差不多,利用 Array 自带的 filter 方法,返回 arr.indexOf(num) 等于 index 的num。原理就是 indexOf 会返回最先找到的数字的索引,假设数组是 [1, 1],在对第二个1使用 indexOf 方法时,返回的是第一个1的索引0。

这个方法的优点是可以在去重的时候插入对元素的操作,可拓展性强。

数组内部移动后返回部分数组

function unique4(arr) {

let right = arr.length – 1;

for (let i = 0; i < arr.length; i++) {

if (right <= i) {

break;

}

if (arr.indexOf(arr[i]) !== i) {

[arr[i], arr[right]] = [arr[right], arr[i]];

right–;

i–;

}

}

return arr.slice(0, right);

}

复制代码

思路:这个方法比较巧妙,从头遍历数组,如果元素在前面出现过,则将当前元素挪到最后面,继续遍历,直到遍历完所有元素,之后将那些被挪到后面的元素抛弃。

这个方法因为是直接操作数组,占用内存较少。

使用 reduce 去重

function unique5(arr) {

return arr.reduce((pre, cur) => {

if (pre.indexOf(cur) === -1) {

pre.push(cur);

}

return pre;

}, []);

}

复制代码

思路:reduce 是 Array 的一个迭代方法,参数为:迭代函数(参数为上一次回调的返回值(pre),当前遍历的元素(cur)),初始值。

在本例中传入一个空数组作为初始值,每次迭代时如果发现 pre 中没有当前元素,就把当前元素推入 pre,然后返回 pre 结束本次迭代。

这个方法花里胡哨的。

性能比较

随机生成五个数组,长度分别为10,100,1000,10000,100000,数值范围分别为0-10,0-100,0-1000,0-10000,0-100000。

分别使用这五个方法对五个数组进行去重后查看执行方法所用的时间。

8cca16ee3f9d3b3c55e3568af73f29d1.png

由图可知,方法1和方法2消耗时间最短,然后依次是3,4,5。处理数据较少时(10000以下)性能是差不多的。

而方法1和方法2中,方法1消耗较多空间,所以建议使用方法2也就是 Set。

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[五种数组去重方法的性能比较]http://www.zyiz.net/tech/detail-136619.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150079.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月18日 下午9:00
下一篇 2022年6月18日 下午9:16


相关推荐

  • Redmi路由器AC2100之Openwrt旁路由设置

    Redmi路由器AC2100之Openwrt旁路由设置一、思路和环境:1、Redmi路由器AC2100作为主路由,路由系统为Padavan,主要负责拨号、DHCP、WIFI等功能,网络地址为192.168.11.1。2、群晖虚拟机vmm安装koolshare的Openwrt,单臂软路由作为旁路由,以实现zerotier等插件功能,网络地址为192.168.11.11。3、将旁路由的网关指向主路由网络地址192.168.11.1,关闭DHCP和桥接;同时,将主路由的网关指向旁路由的网络地址192.168.11.11。通过主路由和旁路由互指网关实现。二、旁路由设置

    2022年6月5日
    157
  • resnet18[通俗易懂]

    resnet18[通俗易懂]前言在前篇vgg16之后,无法成功训练vgg16,发现是自己电脑可用的显存太低了,遂放弃。在2015ILSVRC&COCO比赛中,何恺明团队提出的Resnet网络斩获第一,这是一个经典的网络。李沐说过,如果要学习一个CNN网络,一定是残差网络Resnet。与VGG相比,Resnet则更加出色,为后续的研究做下铺垫这是Resnet论文翻译参考链接:https://blog.csdn.net/weixin_42858575/article/details/93305238在之前的神经

    2022年5月26日
    71
  • Java基础篇:封装、继承、多态三大特性

    Java基础篇:封装、继承、多态三大特性

    2021年10月4日
    64
  • 角色权限表怎么设计_用户角色权限在数据库表中怎样实现

    角色权限表怎么设计_用户角色权限在数据库表中怎样实现设计一个灵活、通用、方便的权限管理系统。      在这个系统中,我们需要对系统的所有资源进行权限控制,那么系统中的资源包括哪些呢?我们可以把这些资源简单概括为静态资源(功能操作、数据列)和动态资源(数据),也分别称为对象资源和数据资源,后者是我们在系统设计与实现中的叫法。系统的目标就是对应用系统的所有对象资源和数据资源进行权限控制,比如应用系统的功能菜单、各个界面的按钮、数据显示的列以

    2026年4月14日
    9
  • css清除浮动无效,css清除浮动的处理方法

    css清除浮动无效,css清除浮动的处理方法根据 精彩绝伦的 css JSBin news outline 1pxsolidpink col float left width 33 outline 1pxsolidblue sometext oneConHugeCo Whatdowemorp Anythingande

    2026年3月18日
    2
  • javaweb教务管理系统源码_java做一个学生管理系统

    javaweb教务管理系统源码_java做一个学生管理系统刚学完javaweb,做个项目练手与巩固所学的知识,同时分享自己写的这个教务管理系统,同样也是为自己记下笔记。为以后复习有帮助。该系统没有用到框架的知识,一共花了7天写出来。所以非常适合javaweb初学者教务管理系统javaweb项目运行环境:window系统,ApacheTomcatv7.0.84、JDK1.8开发环境:J2EEeclipse、navicatformysql运用的技术…

    2022年10月16日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号