热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

当需要对一个集合遍历删除元素的时候,都应该倒着删

这个也是我在实际写东西的时候,发现的一个比较有意义的经验。我对比了jsvascript和C#,发现“当需要对一个集合遍历删除元素的时候,都应该倒着删”这句话实在是一般无二。intn

这个也是我在实际写东西的时候,发现的一个比较有意义的经验。我对比了jsvascript和C#,发现“当需要对一个集合遍历删除元素的时候,都应该倒着删”这句话实在是一般无二。


int nowRemoveIndex = combination.Count() - 1;
while (true)
{
if (combination.Count() > lastCombitionCount)
combination.RemoveAt(nowRemoveIndex);
else
break;
nowRemoveIndex
--;
}

上面这小段代码,是C#的,其中combination表示的是一个List集合。

这段代码的场景指的是,我目前有一个好几层的递归,每一层都会往这个集合插入数据,但是当递归在回归的时候,我发现这不是我要的数据,于是我就要把他从尾部添加上去的数据删掉。

这个很轻易的就可以想到,这个肯定就是从后往前遍历,然后逐个删除。

 

接下来再看一段Javascript代码:


let machineId = app.globalData.machineId
for (let i = cartCache.length - 1; i >= 0; i--) {
if (cartCache[i].MachineID === machineId) {
cartCache.splice(i,
1)
console.log(
‘已清理一条缓存:‘)
console.log(cartCache[i])
}
}

这是小程序中的一段js代码。

当时的代码场景是,假设我目前有好几个购物车,machineId可以看成是分类id,一个分类对应一个购物车(业务场景是虚构的,请不要较真)。但是,我的购物车数据是全部丢到一个集合里面,即上面的cartCache。那现在我要清空其中一个购物车,这个时候就是必须得遍历cartCache,然后用machineId这个标识来找到我要清除的对象。

这里可以看到,我是从后往前遍历,然后才使用splice删除元素的。

 

现在来做个实验,正着删和倒着删的结果会不会不一样


let testArray1 = [1,3,4,5,2,7]
let testArray2
= [1,3,4,5,2,7]
for (let i = 0; i ) {
if(testArray1[i] >= 4)
testArray1.splice(i,
1)
}
for (let i = testArray2.length - 1; i >= 0; i--) {
if(testArray2[i] >= 4)
testArray2.splice(i,
1)
}
console.log(
‘testArray1的结果为:‘)
console.log(testArray1)
console.log(
‘testArray2的结果为:‘)
console.log(testArray2)

上面还是两个普通的js for循环遍历数组然后删除元素,不同的是,一个是正着删,还一个则是倒着删,其结果如下:

技术分享图片

 

 现在思考的时候来了,为什么正着删会多出一个5没删掉呢?

这个是因为,当循环遍历到4的时候,此时 i 的值等于2,在执行完splice的之后,4这个元素被删除了,而 i 顺利成章的 ++,然后变成了 3,而此时索引 3 对应的元素是 2 ,因为4被删除了,所以5变成了刚刚4的位置,正好就这么把5给漏了。

 

以上是用Javascript做的演示,关于其他语言,可以自己多尝试。对于C#,如果正着删的话,代码运行的时候是会直接报错。

 


推荐阅读
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
  • JavaScript 中引号的多层嵌套使用技巧
    本文详细介绍了在 JavaScript 编程中如何处理引号的多级嵌套问题,包括双引号、单引号以及转义字符的正确使用方法。 ... [详细]
  • Python3爬虫入门:pyspider的基本使用[python爬虫入门]
    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要通过爬取去哪儿网的旅游攻略来给大家介绍pyspid ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • Awk是一款功能强大的文本分析与处理工具,尤其在数据解析和报告生成方面表现突出。它通过读取由换行符分隔的记录,并按照指定的字段分隔符来划分和处理这些记录,从而实现复杂的数据操作。 ... [详细]
  • 本文介绍了一个来自AIZU ONLINE JUDGE平台的问题,即清洁机器人2.0。该问题来源于某次编程竞赛,涉及复杂的算法逻辑与实现技巧。 ... [详细]
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • 本文介绍了用户界面(User Interface, UI)的基本概念,以及在iOS应用程序中UIView及其子类的重要性和使用方式。文章详细探讨了UIView如何作为用户交互的核心组件,以及它与其他UI控件和业务逻辑的关系。 ... [详细]
  • 本文探讨了在网站编辑器中使用JavaScript实现优酷视频播放器自适应宽度的方法。尽管尝试过多种CSS解决方案,但都存在一定的局限性,因此最终决定采用JavaScript来动态调整视频播放器的尺寸。 ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • 本文提供了一个详尽的前端开发资源列表,涵盖了从基础入门到高级应用的各个方面,包括HTML5、CSS3、JavaScript框架及库、移动开发、API接口、工具与插件等。 ... [详细]
  • 笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系& ... [详细]
  • 本文基于Java官方文档进行了适当修改,旨在介绍如何实现一个能够同时处理多个客户端请求的服务端程序。在前文中,我们探讨了单客户端访问的服务端实现,而本篇将深入讲解多客户端环境下的服务端设计与实现。 ... [详细]
  • 3DSMAX制作超现实的体育馆模型
    这篇教程是向脚本之家的朋友介绍3DSMAX制作超现实的体育馆模型方法,教程制作出来的体育馆模型非常地不错,不过教程有点难度,需要有一定基础的朋友学习,推荐到脚本之家,喜欢的朋友可 ... [详细]
author-avatar
掌纹clear贡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有