【问题标题】:Ruby: delete an entry from a 2d array if it is not equal to a specific 1d arrayRuby:如果它不等于特定的一维数组,则从二维数组中删除一个条目
【发布时间】:2017-01-22 04:55:39
【问题描述】:

我在理解 Ruby 中某些代码的行为时遇到了一些麻烦。我想将我的二维数组的内容与特定的一维数组匹配。

s = [1,2,3].repeated_permutation(2).to_a
solution = [3,1]
s.each do |x|
    if x != solution
        puts s.length
        print "#{x}\n"
        s.delete(x)
    end
end

我不明白的是这段代码会返回这个:

s = [[1, 2], [2, 1], [2, 3], [3, 1], [3, 3]]

我是一个初学者,我必须忽略一些基本的东西。 我确实通过以一种肯定不理想的方式绕过它来克服这个问题:

s = [1,2,3].repeated_permutation(2).to_a
solution = [3,1]

s.each_with_index do |x,idx|
    if x != solution 
        s[idx] = nil
    end
end

=> [nil,nil,nil,nil,nil,nil,nil,[3,1],nil]

s.flatten!.compact!

=> [3,1]

谁能告诉我执行此检查的最佳 Ruby 方法是什么? 提前致谢

【问题讨论】:

  • each 正在从 s 中删除元素,从原来的 9 个元素中删除 4 个元素,留下长度为 5 的 s

标签: arrays ruby multidimensional-array


【解决方案1】:

你要找的其实是Enumerable#detect:

[[1, 2], [2, 1], [2, 3], [3, 1], [3, 3]].detect { |e| e == [3, 1] }
#⇒ [3, 1]

您的代码返回整个数组的原因是Enumerable#each 迭代器返回接收器本身。不建议在枚举过程中改变枚举,这可能会导致意外/意外的结果。 each 当底层数组改变时会发疯。

【讨论】:

    【解决方案2】:

    查看.select 方法,该方法可用于根据块的评估从数组中选择值。例如:

    s.select { |arry| arry == solution } 
    

    这将返回一个数组,其中包含s 中与solution 数组匹配的元素,例如[[3,1]]

    【讨论】:

      猜你喜欢
      • 2012-01-21
      • 2014-09-07
      • 1970-01-01
      • 2021-02-23
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      相关资源
      最近更新 更多