如何检查数组中只有一个值是非零的?

Zab*_*bba 3 ruby

给定一个数组: [0,1,1]

我怎样才能优雅地检查:只有一个元素具有非零值而其他元素为0?

(所以上面的阵列将失败校验而此阵列将通过:[1,0,0])

Phr*_*ogz 8

my_array.count(0) == my_array.length-1
Run Code Online (Sandbox Code Playgroud)

如果速度很重要,对于可能需要在检测到第二个非零时提前返回的非常大的数组,可能:

def only_one_non_zero?( array )
  found_non_zero = false
  array.each do |val|
    if val!=0
      return false if found_non_zero
      found_non_zero = true
    end
  end
  found_non_zero
end
Run Code Online (Sandbox Code Playgroud)

  • 很棒的方法.@Jacob - `count`方法仅存在于Ruby 1.8.7及更高版本中.见这里:http://ruby-doc.org/core-1.8.7/classes/Array.html (2认同)

Mar*_*off 6

最多选择两个非零元素,并检查是否有一个项目可用.

>> [0,1,1].select {|x| !x.zero?}.take(2).size == 1
=> false
>> [0,1,0].select {|x| !x.zero?}.take(2).size == 1
=> true
>> [1,2,3].select {|x| !x.zero?}.take(2).size == 1
=> false
Run Code Online (Sandbox Code Playgroud)

在Ruby 1.8.7中运行良好,但请注意select返回一个数组,因此它不是"最优懒惰". 这是一篇博客文章,展示了如何在Ruby中创建一些懒惰的枚举器.