2010-12-04 12 views
0
while(i < bArray.length) 
    if(aArray.include?(bArray[i]) == false) then 
    return false 
    end 
    i+=1 
end 

Ich habe das oben geschrieben, aber ich finde es hässlich und aufgebläht. Es muss einen sauberen Weg geben, dies in einer einzigen Aussage zu tun. Aber wie?Machen Sie das in einem einzigen Durchgang?

+1

Aus Gründen der Übersichtlichkeit und Konsistenz schreiben Sie vielleicht auch das erwartete Verhalten in Englisch aus. Dies sollte helfen, alternative Ansätze zu "paaren". Zum Beispiel kann das genaue Endergebnis von "i" (das nur eine temporäre Variable zu sein scheint) wichtig sein. Oder vielleicht nicht. Alternativ kann erwartet werden, dass die Eingabe früh auseinander geht (falls dies der Fall ist). Oder vielleicht nicht. Das hinzugefügte Detail (z. B. nicht "tue dies") kann auch zu dem Fragetitel befördert werden, um einen besseren Beitrag zu erzeugen. –

+0

In Ruby verwenden Sie normalerweise 'snake_case' anstelle von' camelCase'. –

Antwort

6

Dies sollte gleichwertig sein:

while i < bArray.length 
    return false unless aArray.include?(bArray[i]) 

    i += 1 
end 

Hier ist ein Einzeiler, die ich denke, sollten gleichwertig sein:

bArray.all? { |item| aArray.include?(item) } 
+0

weggelassen die 'return' sorry. Ich gebe false zurück, wenn der Char nicht da ist. – Skizit

+0

Ah, das macht mehr Sinn. Ich habe meine Antwort aktualisiert. –

+0

Es ist immer ein gutes Zeichen, wenn mehrere zur gleichen Zeit mit der gleichen Lösung kommen. Es ist normalerweise entweder eine ziemlich gute oder eine ziemlich subtile falsche Lösung :-) –

4
bArray.all?(&aArray.method(:include?)) 
5

Es sieht aus wie Sie versuchen, wenn aArray, um herauszufinden, enthält alle Elemente von bArray.

aArray = %w[a b c d] 
bArray = %w[a b c z] 

(bArray - aArray).empty? # => false 

Ich sah genauer hin den ursprünglichen Code an und es ist eine logische Bombe tickt bekam:

def cmp_array(aArray, bArray) 
    i = 0 
    while (i < bArray.length) 
    if (aArray.include?(bArray[i]) == false) then 
     return false 
    end 
    i += 1 
    end 
end 

def cmp_array2(a, b) 
    (b - a).empty? 
end 

cmp_array(%w[ a b c ], %w[ a b c ]) # => nil 
cmp_array(%w[ a b c ], %w[ c b a ]) # => nil 
cmp_array(%w[ a b c ], %w[ a b  ]) # => nil 
cmp_array(%w[ a b c ], %w[ a b c d ]) # => false 
cmp_array(%w[ a b ], %w[ a b c ]) # => false 

cmp_array2(%w[ a b c ], %w[ a b c ]) # => true 
cmp_array2(%w[ a b c ], %w[ c b a ]) # => true 
cmp_array2(%w[ a b c ], %w[ a b  ]) # => true 
cmp_array2(%w[ a b c ], %w[ a b c d ]) # => false 
cmp_array2(%w[ a b ], %w[ a b c ]) # => false 

ich die i = 0 initializer sonst Rubin beschwerten sich über die nicht initialisierten Variablen hinzufügen hatte.

Beachten Sie, dass cmp_array entweder nil oder false zurückgibt und einen zusätzlichen Test für oder false? erzwingt, um etwas Nützliches zu tun.

if (cmp_array(%w[ a b c ], %w[ a b c ]).nil?) ... 

oder:

if (cmp_array(%w[ a b c ], %w[ a b c d ]).false?) ... 

Vergleich zu:

if (cmp_array2(%w[ a b c ], %w[ a b c ])) ... 

die konsequent true/false zurückgibt.

Verwandte Themen