【问题标题】:Excluding first element by value from array从数组中按值排除第一个元素
【发布时间】:2015-07-06 12:15:37
【问题描述】:

我想得到这样的东西:

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

但在我看来,它看起来像气味。有没有更优雅的单线解决方案? (换句话说 - 如何为 Array 定义方法“except”?)

UPD

我解决了这个问题

class Array
  def except(elem)
    dup.tap{|a| a.delete_at(a.index(elem))}
  end
end

你怎么看?

【问题讨论】:

  • 写一个封装元素查找和切片的方法。没有理由欺骗数组,只需取值两侧的元素即可。
  • 元评论:对我来说,因为误解而无聊的答案似乎很极端——只要评论澄清,用户就会监督他们自己的内容。
  • 我没有投反对票,但是,在投反对票按钮的工具提示中提到的投反对票的可能原因之一是“这个问题不清楚”,因此,如果用户觉得问题不清楚,downvoting 完全没问题。即使那个用户碰巧弄错了,也有 410 万其他用户可以投票。
  • 这个问题有什么不清楚的地方?
  • Gena,我喜欢你使用tap,所以修改了我的Array#difference 代码(在我的答案中给出的链接)使用tap 代替cpy = dup,然后@987654331 @ 作为最后一行。我喜欢这种方法的声音,以至于有时我写obj.tap{}.tap{}.tap { |x| ... }。

标签: ruby


【解决方案1】:

您的解决方案有什么“奇怪”的地方?

这也是我首先想到的(在阅读整个问题之前开始破解:P)

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

或者您可以使用delete_if 的力量(包括count 我从@mudasobwa 的答案中偷来的:

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

【讨论】:

  • 赞成slice(我会改写为self[0...index] + self[index+1..-1])。
  • 您可以将 slice 调用替换为:reject.with_index { |_, i| i == index }
  • 这将与delete_if 解决方案相同。
  • @Manuel 谢谢,看起来不错。在有问题的 UPD 下查看我自己的解决方案
  • 啊,很有趣!不知道tap!但是,我实际上更喜欢您的第一个版本,因为它更具可读性。从技术上讲,这是相同的解决方案。
【解决方案2】:
class Array
  def except what, count = 1
    memo = 0
    map do |e| 
      what == e && (memo += 1) <= count ? nil : e
    end.compact
  end
end

以上将删除countwhat的出现:

a.except(1, 2) 
#⇒ [0,0,0,0,1,0]

【讨论】:

  • 很酷的解决方案,但请注意您的阵列是否如下所示:[0, nil, 0, 0, nil, 0, nil, 0]。但是,无论如何,谁的数组中有nils...
【解决方案3】:

你可以写:

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

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

Array#difference 在我的回答here 中定义。

【讨论】:

  • 和我在UPD下的解决方案一样,很酷,谢谢
  • 当difference的参数是一个包含单个元素的数组时,是的。
猜你喜欢
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 2019-03-09
  • 2012-04-19
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多