试图从数组中删除元素

时间:2014-10-09 05:04:59

标签: ruby

好的,我知道Ruby拥有丰富的各种允许从数组中删除的方法,例如shift,pop,delete,drop等。

但是如果你试图在不使用这些方法的情况下重写方法,那么如何弄清楚如何从数组中删除元素?

如果有一个数组,请说a = [10, 2, 7, 5]并且您要从中移除2个元素,a[0]a[1],如drop method,这是如何完成的?

么?

修改

对不起,本来应该更清楚一点 - 我试图在没有 Array或Enumerable库的任何方法的情况下执行此操作

编辑两个

哇,这么多评论! =)再次,我道歉。我一直忘记提到我允许自己使用的唯一方法是尺寸。但除此之外,我已经开始的整个练习(阅读,疯狂的帽子计划)实际上对我个人而言非常有教育意义。它迫使我真正理解这些方法背后发生的事情。

对不起,除了我在这里所说的之外,我不知道如何进一步澄清这个问题。

我意识到虽然这个问题可能不是最好的时间效率,因为Ruby确实有很棒的方法,但我要求一个理由,那就是,这是我自己的启示,我需要帮助搞清楚件等。

如果还有其他什么我可以进一步了解,请问。否则,感谢所有回复的人!真的很谢谢你。

4 个答案:

答案 0 :(得分:0)

您可以使用delete_at方法,

  

删除指定索引处的元素,返回该元素或   如果指数超出范围,则为零。

答案 1 :(得分:0)

你的意思是Ruby本身如何实现它?点击"点击切换来源"将鼠标悬停在您链接的页面中的功能说明上时显示的按钮。你是说没有dropshiftdelete你将如何完成?使用slice!。或者你的意思是即使没有它?循环元素并将它们一个接一个地移动,但这很难快速。

编辑:"没有来自数组或可枚举库的任何方法":如果没有Array的任何方法,您无法执行此操作,因为任何与ArrayArray中的方法。除了Array[][]=(以及size之外的任何new方法,此代码都会执行此操作(或非常接近它的方法) {1}}):

diy_drop

对于class Array def diy_drop!(x) new_size = size - x size.times do |i| self[i] = i < new_size ? self[i + x] : nil end self end def diy_drop(x) result = [] (size - x).times do |i| result[i] = self[i + x] end result end end ,这是你能得到的最接近的;数组将留下一些dangly diy_drop!,因为除了你想要实现的方法之外,没有办法调整nil的大小。这不是Array的问题,因为它会创建一个新数组。

diy_drop

你也可以&#34;作弊&#34;并将a = [1, 2, 3, 4, 5] a.diy_drop(2) # => [3, 4, 5] a # => [1, 2, 3, 4, 5] a.diy_drop!(2) # => [3, 4, 5, nil, nil] a # => [3, 4, 5, nil, nil] []方法与范围参数一起使用:

[]=

(我说&#34;作弊&#34;因为使用它们几乎相当于使用各种删除/切片功能。)

答案 2 :(得分:0)

我确切地知道你的意思:使用ArrayEnumerable方法会变得非常无聊。不幸的是,对于数组而言,我不认为你可以做你想做的事情,而不使用该类或该模块中的至少一种方法。

但是,如果数组的所有元素都是字符串,那么就有办法。如果是我厌倦了ArrayEnumerable方法的那一天,我会使用Object#to_enumEnumerator#next,{{ 3}}和三个String方法:

a = ["a","b","c","d","e"]

enum = a.to_enum
enum.next
enum.next
str = ''
loop do 
  s = enum.next
  str << "#{s} "
end
str.split
  #=> ["c", "d", "e"]

当然,Array包含Object方法,但这不算数。

答案 3 :(得分:-1)

试试这个:

class Array
  def my_drop_method(i)
    self[i..self.size]
  end
end

现在使用这种方法:

a = [10, 2, 7, 5]
a.my_drop_method(2)
=> [7, 5]

selfcontext中的当前对象。

这里my_drop_method实例方法self等于[10,2,7,5],即a

试试这个:

根据您更新的问题,这是新答案:

  a = [10, 2, 7, 5]
  => [10, 2, 7, 5]
  n = 2 // number of elements to remove
  => 2
  r = Regexp.new('\d+,' * n)
  => /\d+,\d+,/
  a.to_s.gsub(/\[|\]|\s/,'').match(r).post_match.split(',')
  => ["7", "5"]