数组去重的方法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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Ubuntu安装JDK教程

    Ubuntu安装JDK教程Ubuntu安装JDK教程jdk的下载和安装:1、打开浏览器,输入jdk的官网地址:https://www.oracle.com/java/technologies/javase-downloads.html,如图:2、找到需要下载的jdk版本,这里以1.8版为例,找到JavaSE8,点击JDKDownload,跳转到JavaSE8的下载页面,如图:3、找到对应的下载版本,我这里是Ubuntu64位的系统,需要找到linux64的jdk版本,点击进行下载,如图:4、下载成之后

    2022年7月12日
    15
  • win10 硬盘图标变成空白解决办法是什么_新电脑如何分区硬盘win10

    win10 硬盘图标变成空白解决办法是什么_新电脑如何分区硬盘win10Win10硬盘图标变成空白解决办法如图,有时候会出现这种硬盘图标变成空白的情况,虽然不影响使用,但强迫症表示真的很难受,这里给出解决办法:按下组合键WIN+R,输入regedit再按回车运行,这时候会有一个提示,选择“是”。一层一层找到计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DriveIcons\这个路径,或者也可以直接在上方地址栏输入,注意我这里路径最开始显示的是计

    2022年10月18日
    0
  • eth挖矿软件_PI挖矿

    eth挖矿软件_PI挖矿Gpu矿机使用(文章测试使用的是AMD580显卡,Ethminer0.17.0)先执行ethminer-G–list-devices查看Gpu数量,我的机器是8Gpu,执行命令后1首先启动geth节点   geth–port33333–rpc–rpcapieth–rpcaddr192.168.10.176–rpcport8888conso…

    2022年10月9日
    0
  • pytest运行_python缓存机制

    pytest运行_python缓存机制前言pytest运行完用例之后会生成一个.pytest_cache的缓存文件夹,用于记录用例的ids和上一次失败的用例。方便我们在运行用例的时候加上–lf和–ff参数,快速运行上一

    2022年7月30日
    5
  • 苹果新旧手机数据转移_换机必备知识:如何将数据转移到Oppo手机上

    苹果新旧手机数据转移_换机必备知识:如何将数据转移到Oppo手机上现在的智能手机越来越便宜了,换手机是经常的事情。但唯一的缺点是更换手机时新旧手机的数据备份很麻烦。许多人会选择将数据传输到计算机,然后再传输到新手机。或者,用户将可以备份的内容备份到microSD卡上。但这些方法都比较老土。如今,智能手机制造商拥有专用的应用程序,可以使此过程变得轻松,高效和无缝。本指南将教您如何将所有个人数据(SMS,电话,应用程序,照片等)从旧手机转移到Oppo品牌的手机上。…

    2022年5月25日
    226
  • ubuntu 20.04 lts安装_vmware如何安装

    ubuntu 20.04 lts安装_vmware如何安装ubuntu22.04lts安装步骤

    2022年9月8日
    0

发表回复

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

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