热门关键词 Java编程、C#/.NET编程、Python编程 Web前端、SQL数据库 新手编程1001问(10) 为什么有了IndexOf,还要有FindIndex?...【摘要】对于IndexOf(),相信大家都是很熟悉的,但是,昨天我们提供的List用法中还有一个FindIndex(),看起来功能描述与IndexOf()是一样的啊,可是,这真的有必要吗?...是啊,为什么啊?这两个方法对比,孰优孰劣呢?...(key); //返回值 第一个匹配的位置索引值,如果不存在,则返回-1。...对呀,既然使用起来,功能和返回值是一样的,有必要定义两套东西吗? 答案挺有意思:这样做是有历史原因的。 因为在C#1.0中,只有IndexOf()。
用来截取数组或字符串 splice 会改变原数组,slice 不会改变原数组 三、为什么有了 indexOf 方法,在 ES7 中还要新增 includes 方法呢?...在之前的 indexOf 方法中存在着一些问题,主要是在于 NaN 的判断上,indexOf 没有办法去判断数组中是否存在 NaN 值,当我们需要判断数组中是否存在 NaN 值的时候,我们需要采用 includes...来判断 采用 indexOf 就会出现下面这样的差异 同时当数组有空值的时候, includes 会认为空值为 undefined ,而 indexOf 不会,再来看段代码 因此,includes...的出现就是为了解决 indexOf 遗留的一些问题 总结以上: includes 能够判断数组中有无 NaN 值 includes 会把空值默认成 undefined 如果想要判断数组中是否存在某个值...,可以采用 includes ,查找数组中某个值的位置可以采用 indexOf 四、伪元素有哪些作用呢?
我记得大约在半年前,有个朋友问我一个问题,现在有一个选型: 一个性能敏感场景,有一个集合,需要确定某一个元素在不在这个集合中,我是用数组直接Contains还是使用HashSet.Contains...所以无论如何场景我们都直接无脑使用HashSet就行了吗?大家看滑动条就知道,故事没有这么简单。 刚刚我们是引用类型的比较,那值类型怎么样?...,使用原始的for循环比较会快,然后HashSet就变为最快的了,在更多元素的场景中Array.IndexOf会比for更快: 至于为什么在元素多的情况Array.IndexOf会比for更快,那是因为...Array.IndexOf底层使用了SIMD来优化,在之前的文章中,我们多次提到了SIMD,这里就不赘述了。...既然如此我们再来确认一下,到底多少个元素以内用for会更快,可以看到16个元素以内,for循环会快于HashSet: 总结 所以我们应该选择HashSet还是数组呢?
思路: 既然我们要找一对数,且这一对数的和Y是确定的,那么我们知道X就可以知道需要什么数(Y-X) 所以我们找的是(Y-X)但是遍历原数组比较慢且需要对比,如果建立一个新的对照表比如 我们有一个数组...arr = [1,3,4,2] 求出和target等于6的两数的下标 我们可以新建一个空数组arrN=[]用来存储target-value(当前遍历的arr数组的某个值,比如1也可以是3/4/2)...遍历arr的时候每次先从arrN中看看当前arr数是否存在于arrN 为什么呢,arr遍历第一次的时候 arrN为空,我们让arrN存储5 (6-1) 此时arrN=[5] 此时我们发现5在arrN...中的下标是0,1在arr中的下标也是0 继续遍历arr此时遍历到值为3 我们用arrN.indesOf(3)来返回arrN中第一次出现3的下标,如果没有就返回-1,很显然arrN=[5]中并没有3,然后...]中并没有4,然后arrN存储2(6-4) 此时arrN=[5,3,2] 继续遍历arr此时遍历到值为2 我们用arrN.indesOf(2)来返回arrN中第一次出现4的下标,如果没有就返回-1,
我们的目标是能少些一个字符,绝不多写 背景在日常开发中,我们经常会遇到需要检查字符串中是否包含某个子串的情况。通常的做法是使用indexOf()方法,并与-1比较,但这种方法在可读性方面并非最佳。...按位非操作符(~)使用~操作符rust复制代码if (~str.indexOf("subStr")) { // 子字符串存在} else { // 子字符串不存在}原理分析~操作符为什么使用~操作符后...,就不用写>-1了呢?...梳理 使用~str.indexOf(xxx)后得到的结果一定是小于等于0的数字而if括号内的表单式会将数字隐式转换为布尔值因此只有~-1 ==> 0 ==> false,其它情况都是true非常有趣的隐式转换为什么加...[]优先执行将数组转成布尔值再取反返回false,再转成数字,因此结果也是0为什么"5">15为false,而"5">"15"为true原因是:两个字符串数字比较的不是数字本身,而是通过charCodeAt
不要相信“-1” 我知道这很偏执,Javadoc中关于 String.indexOf() 的早期描述是这样的… “字符在字符序列中第一次出现的位置将作为结果[被返回],如果字符不存在则返回-1。...= -1) { ... } // Good if (string.indexOf(character) >= 0) { ... } 谁知道呢。...也许在某个特定场合下他们将会需要另一种 编码值,如果不区分大小写的话,otherString 就会被包含进去…此时或许可以返回 -2呢?谁知道呢。...为什么不开始讨论 -1呢,某种意义上来说 -1 是 null 在int类型下的另一种形式。 4.避免意外的赋值 是的。即使最优秀的程序员也可能犯这种错误(当然,不包括我。看#7)。...不管怎样,我们既然无法摆脱 switch ,在必要的时候我们最好能够正确使用它,例如: Java代码 // Bad switch (value) { case 1: foo(); break
具体的 splice 的用法见文档:Array.prototype.splice() .indexOf() indexOf: emptyArray.indexOf 简单地复制了数组的 indexOf 方法...例如 $('li').get(-1) 返回的是倒数第1个元素,也即最后一个元素 .toArray() toArray: function() { return this.get() } toArray...this.toArray() : this, args) }, 数组中也有对应的 concat 方法,为什么不能像上面的方法那样直接调用呢?...这是因为 $.fn 其实是一个类数组对象,并不是真正的数组,如果直接调用 concat 会直接把整个 $.fn 当成数组的一个 item 合并到数组中。...==,因为 callback 如果没有返回值时,得到的值会是 undefined ,这种情况是需要排除的。 同样,each 的回调中也是可以用 this 拿到每个元素的。
我们想要在数组中任意的插入和删除元素的成本很高,虽然在js中我们有便捷的方法可以操作数组,但是其底层原理仍旧是这样的。只是我们对它并没有感觉,比如在java中,声明一个数组是必须要限制它的长度的。...3、remove(element),从列表中移除一项。 4、indexOf(element),返回该元素在列表中的索引,如果列表中没有该元素就返回-1。 ...//还有,这里的“=”,实在是让人很迷茫,既然是指针,为什么要“赋值”? //因为无论是head、node.next(链表节点元素的指针)还是current还是下面会声明的previous。...//获取该元素在链表中的位置 this.indexOf = function (element) { let current = head,index = -1;//不解释了,这里index...index ++; current = current.next; } return -1; }; // 我们既然有了indexOf和removeAt,这个remove
今天我们来继续 Javascript 数组系列的文章,上文 《Javascript数组系列二之迭代方法1》 我们说到一些数组的迭代方法,我们在开发项目实战的过程中熟练的使用可以大大提高我们的开发效率以及数据的处理...,原因是因为我们给定了一个初始值之后,方法开始执行的位置发生变化,那么是如何变化的呢?...既然如此我们就不做过多介绍,还是利用我们在「find」方法中使用的案例。...indexOf 该方法会对给定的一个值在数组中进行查找,如果找到相同的元素则返回元素的索引,否则返回 -1 。...那有没有从后向前查找元素的方法呢?答案是肯定的,后面我们会继续说的,在这之前我们先来看一个我们在项目开发过程中经常使用的一个例子。
在js中,我们新建一个数组并不需要限定他的大小也就是长度,但是实际上,数组的底层仍旧为初始化的数组设置了一个长度限制。...我们想要在数组中任意的插入和删除元素的成本很高,虽然在js中我们有便捷的方法可以操作数组,但是其底层原理仍旧是这样的。只是我们对它并没有感觉,比如在java中,声明一个数组是必须要限制它的长度的。...3、remove(element),从列表中移除一项。 4、indexOf(element),返回该元素在列表中的索引,如果列表中没有该元素就返回-1。 ...//还有,这里的“=”,实在是让人很迷茫,既然是指针,为什么要“赋值”? //因为无论是head、node.next(链表节点元素的指针)还是current还是下面会声明的previous。...index ++; current = current.next; } return -1; }; // 我们既然有了indexOf和removeAt,这个remove
分布不同的原因是 v8 引擎中针对短数组和长数组使用了不同的排序方法(下面会讲)。可以看到,两种算法的结果虽然不同,但都明显不够均匀。...翻看v8引擎数组部分的源码,注意到它出于对性能的考虑,对短数组使用的是插入排序,对长数组则使用了快速排序,至此,也就能理解为什么() => Math.random() - 0.5并不能真正随机打乱数组排序了...方案一 既然(a, b) => Math.random() - 0.5的问题是不能保证针对同一组a、b每次返回的值相同,那么我们不妨将数组元素改造一下,比如将每个元素i改造为: let new_i =...{ v: i, r: Math.random() }; 即将它改造为一个对象,原来的值存储在键v中,同时给它增加一个键r,值为一个随机数,然后排序时比较这个随机数: arr.sort(...方案二(Fisher–Yates shuffle) 需要注意的是,上面的方法虽然满足随机性要求了,但在性能上并不是很好,需要遍历几次数组,还要对数组进行splice等操作。
既然上面的示例程序中我们已经使用的获取集合大小的size()方法,在这里我们就对其进行分析好了。看下程序代码咯。...,也就是数组中已存在元素的数量。...-1,这样在contains()方法调用indexof()方法时就与0进行比较,返回true或者false } 上面的indexOf()方法就是循环遍历整个数组,然后分两种情况进行判断,因为集合里面是可以添加...既然可以根据索引下标依靠get方法获取元素值,同理,我们可以根据元素值来获取该元素的索引下标,这时我们就用到了indexOf()方法。...} 上面的indexOf()方法就是循环遍历数组,分别针对null和非null情况进行判断,找到了就返回对应的索引下标,找不到就返回-1。
前言 在我们的日常开发中,集合类是我们基本上每个人都会用经常用到的东西,用着用着,突然有一天我心生好奇,那么java集合类的这些源码是什么呢?...如果是,那么取我们传入的值(也就是size + 1)和默认的数组长度(长度为10)中的最大值。然后调用了ensureExplicitCapacity()方法。我们继续看这个方法: ?...后来突然想到indexOf()方法是一个public方法,也是我们经常使用的方法。可能就在这里java编写者进行方法重用就不必再重复写新方法来判断。...顺带着我们就把indexOf()方法介绍,方法就是返回第一个匹配传入对象的元素下标。如果数组中没有匹配元素那么返回-1。 (7)get() ?...总结 首先ArrayList内部是由数组来实现的。而且在存放数据的数组长度不够时,会进行扩容,即增加数组长度。在Java 8中是默认扩展为原来的1.5倍。 既然是数组,那么优点就是查找某个元素很快。
前言 这两天在家中帮朋友做项目,项目中使用了数组的indexOf 方法,找到了一篇文章,感觉非常不错,顺便整理下以防链接丢失。...而 -1 代表未匹配。 曾经有人问我为什么偏偏是 -1 不是 null 或者 undefined。你去问制定规则的人啊!一脸无奈。...array 类型的使用 大家提起精神,大boss来了。 数组方法大家再熟悉不过了,却忽略了数组有 indexOf 这个方法(我个人感觉)。 干说不练瞎扯淡,遇到了什么问题,注意要点又在哪里?...arr.indexOf(2016)输出 -1 注意:这里不会做隐式类型转换。 既然坑已经发现我们不妨刨根问底。去MDN官网一看究竟。...Array:数组同样有indexOf 方法,只不过做类型判断时,使用的严格相等(strict equality),也就是 === 。 (完)
题意 给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。...所以当我们从x向x+m遍历的时候,必然会重复遍历一部分已经在队列当中的状态。那怎么解决呢? 其实很简单,我们只需要把遍历的顺序倒过来就好了。...不对的地方在于既然我们已经想到了这么具体的策略来优化搜索,我们为什么还要用搜索呢?因为我们没必要维护状态了,直接贪心不行吗?...既然如此,我们为什么还要用队列来存储呢,直接维护最大的潜力值不就可以了? 解释一下上面这段话的意思,在当前问题当中,由于我们可以走的距离是连续的。...对于rangeI当中的每一个位置的潜力值而言,它们显然有一个最大值,我们假设最大值的下标是x,它的潜力值就是x+nums[x]。
我们把数组当中每个位置的数字称为前进能力,我们当下能达到的最远的位置前进能力可能很差,所以贪心能够达到最远的位置并不可行,举个例子: [3, 1, 5, 1, 4, 2] 如果我们从0开始的时候走到3的话...所以当我们从x向x+m遍历的时候,必然会重复遍历一部分已经在队列当中的状态。那怎么解决呢? 其实很简单,我们只需要把遍历的顺序倒过来就好了。...不对的地方在于既然我们已经想到了这么具体的策略来优化搜索,我们为什么还要用搜索呢?因为我们没必要维护状态了,直接贪心不行吗?...既然如此,我们为什么还要用队列来存储呢,直接维护最大的潜力值不就可以了? 解释一下上面这段话的意思,在当前问题当中,由于我们可以走的距离是连续的。...对于rangeI当中的每一个位置的潜力值而言,它们显然有一个最大值,我们假设最大值的下标是x,它的潜力值就是x+nums[x]。
不要相信“-1” 我知道这很偏执,Javadoc中关于 String.indexOf() 的早期描述是这样的: “字符在字符序列中第一次出现的位置将作为结果[被返回],如果字符不存在则返回-1。”...也许在某个特定场合下他们将会需要另一种 编码值,如果不区分大小写的话,otherString 就会被包含进去…此时或许可以返回 -2呢?谁知道呢。...为什么不开始讨论 -1呢,某种意义上来说 -1 是 null 在int类型下的另一种形式。 4. 避免意外的赋值 是的。即使最优秀的程序员也可能犯这种错误(当然,不包括我。看#7)。...检查null和长度 不管什么时候你有一个集合、数组或者其他的,确保它存在并且不为空。 ? 你不知道这些数组来自哪儿,也许是早期的JDK API呢? 6....不管怎样,我们既然无法摆脱 switch ,在必要的时候我们最好能够正确使用它,例如: ? 因为在当 value=3 被引入到软件中的时候,default 就能发挥作用,使其正常运行!
“那为什么不补 1 呢?”三妹这个问题很尖锐。 “因为是算术右移,并且是正数,所以最高位补 0;如果表示的是负数,就需要补 1。”...“二哥,那怎么更新 ArrayList 中的元素呢?”三妹继续问。 可以使用 set() 方法来更改 ArrayList 中的元素,需要提供下标和新元素。...“二哥,那怎么删除 ArrayList 中的元素呢?”三妹继续问。 remove(int index) 方法用于删除指定下标位置上的元素,remove(Object o) 方法用于删除指定值的元素。...“二哥,那怎么查找 ArrayList 中的元素呢?”三妹继续问。 如果要正序查找一个元素,可以使用 indexOf() 方法;如果要倒序查找一个元素,可以使用 lastIndexOf() 方法。...indexOf(o) >= 0; } 如果 ArrayList 中的元素是经过排序的,就可以使用二分查找法,效率更快。
领取专属 10元无门槛券
手把手带您无忧上云