2010-12-28 3 views
3

ein Array wie Gegeben: [0,1,1]Wie überprüft man, dass nur ein Wert in einem Array nicht Null ist?

Wie kann ich elegant, dass der Check: nur ein Element mit einem Wert ungleich Null hat, und dass die andere sind 0?

(also die obige Anordnung wird die Überprüfung fehlschlagen, während das Array übergeben wird: [1,0,0])

+2

Wie groß wird dieses Array sein? Manchmal ist elegant Overkill, wenn ein Array nur (relativ) wenige Elemente hat. – zsalzbank

+0

Es wird winzig sein, vielleicht 4-5 Elemente – Zabba

Antwort

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

Wenn die Geschwindigkeit wichtig ist, für sehr große Arrays, wo Sie brauchen, um früh zurückzukehren auf eine zweite nicht-Erfassungs -zero, vielleicht:

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 
+0

@Phrogz Woher kommt die 'count' Methode? Ich sehe es weder in der Array-Klasse noch in Enumerable. –

+2

Toller Weg, es zu tun. @Jacob - Die 'count' Methode existiert nur ab Ruby 1.8.7. Siehe hier: http://ruby-doc.org/core-1.8.7/classes/Array.html – dontangg

+0

@JacobRelkin Es ist in meinem Array: 'Array.instance_methods (false) .grep/count/# => [: zählen ] '. Es ist sicherlich [in 1.9] (http://ruby-doc.org/ruby-1.9/classes/Array.html#M000753). – Phrogz

6

Wählen Sie höchstens zwei Elemente ungleich Null aus und prüfen Sie, ob genau ein Element verfügbar war.

>> [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 

funktioniert gut in Ruby 1.8.7, aber beachten Sie, dass select ein Array zurückgibt, so ist es nicht "optimal faul". Here's a blog post zeigt, wie man einige faule Enumeratoren in Ruby erstellt.

2

Vielen Dank für Ihre Antworten!

I gelöst zu:

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

Rubin, Ich liebe dich!

+4

Sie können das weiter vereinfachen:' [0,0,0] - [0] # => [] 'was bedeutet, dass Sie schreiben könnten:' result = input_array - [0] ' –

Verwandte Themen