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

时间:2010-12-28 05:13:01

标签: ruby

给定一个类似:[0,1,1]

的数组

我如何优雅地检查:只有一个元素具有非零值而其他元素为0?

(因此,当此数组将通过时,上述数组将无法通过检查:[1,0,0]

3 个答案:

答案 0 :(得分:8)

my_array.count(0) == my_array.length-1

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

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

答案 1 :(得分: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

在Ruby 1.8.7中运行良好,但请注意select返回一个数组,因此它不是“最优懒惰”。 Here's a blog post展示了如何在Ruby中创建一些惰性枚举器。

答案 2 :(得分:2)

感谢您的所有答案!

我也解决了:

input_array = [0,0,0]
result = input_array - [0]
p result.size == 1 && result[0] == 1

Ruby,我爱你!