Ruby:如果它不等于特定的1d数组,则从2d数组中删除一个条目

时间:2016-09-14 11:40:06

标签: arrays ruby multidimensional-array

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

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方法是什么? 提前致谢

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

您所寻找的实际上是Enumerable#detect

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

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