从数组中除去第一个元素的值

时间:2015-07-06 12:15:38

标签: ruby

我想得到这样的东西:

a                       =  [0,1,0,0,1,0,1,0]
a.except(1)           # => [0,0,0,1,0,1,0]
a                     # => [0,1,0,0,1,0,1,0]
a.except(1).except(1) # => [0,0,0,0,1,0]

如您所见,a的第一个元素等于except的参数已从a中删除。

我能做到:

tmp_a = a.dup
tmp_a.delete_at(a.index(1))
tmp_a

但在我看来,它看起来像嗅觉。有更优雅的单线解决方案吗? (换句话说 - 如何定义方法"除了"对于数组?)

UPD

我解决了这个问题所以

class Array
  def except(elem)
    dup.tap{|a| a.delete_at(a.index(elem))}
  end
end
你觉得怎么样?

3 个答案:

答案 0 :(得分:2)

你的解决方案有什么“hacky”?

这也是我第一次想到的东西(在阅读整个问题之前开始乱砍:P)

class Array
  def except(elem)
    tmp = self.dup
    tmp.delete_at(self.index(elem))
    tmp
  end
end

或者你可以使用delete_if的力量(包括我从@mudasobwa的回答中偷走的count

class Array
  def except(elem, count = 1)
    tmp = self.dup
    memo = 0
    tmp.delete_if { |e| elem == e && (memo += 1) <= count }
  end
end

或者您可以将slice数组添加到位:

class Array
  def except(elem)
    index = self.index(elem)
    self.slice(0, index) + self.slice(index + 1, self.length)
  end
end

答案 1 :(得分:1)

class Array
  def except what, count = 1
    memo = 0
    map do |e| 
      what == e && (memo += 1) <= count ? nil : e
    end.compact
  end
end

以上内容将移除count what a.except(1, 2) #⇒ [0,0,0,0,1,0] 的出现次数{/ 1}}

DoCmd.RunSQL "INSERT INTO [myTable] ([Last Date]) 
VALUES (" & Format(currDateTime, "\#yyyy-mm-dd hh:nn:ss\#") & ")"

答案 2 :(得分:1)

你可以写:

a.difference [1]
  #=> [0,0,0,1,0,1,0] 

a #=> [0,1,0,0,1,0,1,0]

我的回答here中定义了Array#difference