从数组中删除第一个匹配元素的实例

19 浏览
0 Comments

从数组中删除第一个匹配元素的实例

假设我有一个数组 [1,2,3,1,2,3],我想要删除数组中的第一个 (比如说) 2,使得数组变为 [1,3,1,2,3]。最简单的方法是什么?

0
0 Comments

Ruby的Array类中没有提供直接删除数组中第一个匹配元素的方法。用户通过编写自定义的delete_first方法来实现该功能。该方法首先通过index方法查找匹配元素的索引,如果找到了匹配元素,则调用delete_at方法删除该索引对应的元素。如果没有找到匹配元素,就删除最后一个元素。用户认为这个功能应该成为Ruby标准库的一部分。

为了更正式地提出建议,用户询问是否有地方可以向Ruby官方提交建议。

0
0 Comments

删除数组中第一个匹配元素的问题的出现原因是为了避免将nil发送给li.delete_at,从而导致TypeError错误。为了提高可读性,可以使用更简洁的代码:li.delete_at li.index(42) unless li.index(42).nil?。

为了提高性能,可以将li.index(42)存储在一个变量中,以避免重复搜索。这对于大型数组的性能会更好。

0
0 Comments

文章标题:删除数组中第一个匹配元素的问题及解决方法

在Ruby中,有一个问题是如何从数组中删除第一个匹配的元素。下面的代码演示了如何解决这个问题:

li.delete_at(li.index(n) || li.length)

这行代码的作用是删除数组`li`中第一个匹配元素`n`。如果`n`不存在于数组中,那么`li.length`会超出数组范围,所以`|| li.length`这部分代码处理的是`n`不在数组中的情况。

下面是一些示例的运行结果:

irb(main):001:0> li = [1,2,3,1,2,3]
=> [1, 2, 3, 1, 2, 3]
irb(main):002:0> li.delete_at(li.index(2) || li.length)
=> 2
irb(main):003:0> li.delete_at(li.index(42) || li.length)
=> nil
irb(main):004:0> li
=> [1, 3, 1, 2, 3]

这个问题的提问者感谢解答者提供的解决方法,并表示之前一直在苦苦寻找一个优雅的解决办法。

提问者对代码中的`|| li.length`部分不太理解,并希望有人能够解释一下。解答者解释说,在Ruby中,任何值都可以作为布尔值处理,只有`false`和`nil`会被认为是假。双竖线的语法`a || b`是一种方便的简写形式,意思是如果`a`不是`nil`,则返回`a`,否则返回`b`。

提问者进一步问道,那么`li.length`是不是表示“不删除任何元素(因为`length(n)`总是超出数组范围),并返回`nil`”呢?解答者回答说,没错,这样做是为了使代码变成一行,并且只需要一次遍历。另一种方式是将索引存储在一个变量中,然后只有在变量值非`nil`的情况下才执行`delete_at`操作。但是,这样做会在检查之后留下一个多余的变量。例如,`index = arr.index(3) && arr.delete_at(index)`会在检查之后保留`index`变量。

最后,提问者表示理解了解答者的解释,并表示之前对代码的作用一无所知。提问者还表示喜欢将此解决方法作为标准库的一部分。

文章结束。

0