2016-11-26 2 views
1

Lets nehme ich das Follow-Array haben:erstellen zwei Arrays auf, was eine Bedingung erfüllen und die diff

a = [1,2,3] 

Ich will es von ihm in zwei Reihen spalten, eine mit Positionen, für die eine Bedingung ist, Wahr, und andere, für die die gleiche Bedingung falsch ist:

b, c = a.split_in_two_arrays_or_something_like_that {|x| x == 3} 
#=> b = [3] 
#=> c = [1,2] 

Wie kann ich das in Rubin tun? Ich möchte nicht Code mit etwas wie wiederholen:

b = a.reject {|x| x == 3} 
c = a.reject {|x| x != 3} 

Noch Iterate über das Array zweimal.

Gibt es eine Methode, die mir etwas anders als das modifizierte Array zurückgeben? Zum Beispiel funktioniert delete_if, wenn es die gelöschten Elemente zurückgeben würde, aber das ursprüngliche Array hätte dasselbe beibehalten, aber es funktioniert nicht so.

Antwort

4

Verwenden Sie Enumerable#partition, um die Elemente in Ihrem Array gemäß einer Bedingung zu trennen. Wir definieren den Zustand in partition ‚s Block:

a = [1,2,3] 

b, c = a.partition { |x| x == 3 } #=> [[3], [1, 2]] 

b #=> [3] 
C#=> [1, 2] 

diesem Verfahren wird ein Array mit zwei Subarrays erzeugt.

  • Die erste Subarray enthält die Werte für die partition ‚s Block wahre zurückgibt.
  • Das zweite Subarray enthält die Werte, für die der partition Block false zurückgibt.

Schließlich wenden wir parallel-Zuweisungs Variablen zuweisen b mit dem ersten Subarray und c auf die zweite.

Verwandte Themen