563 Stimmen

Wie kann man in Ruby ein Array zu einem anderen Array hinzufügen, ohne dass das Ergebnis mehrdimensional ist?

Ich habe es versucht:

somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray.push(anotherarray.flatten!)

Ich erwartete

["some", "thing", "another", "thing"]

aber bekam

["some", "thing", nil]

41voto

Joshua Cheek Punkte 28392

Hier sind zwei Möglichkeiten, beachten Sie in diesem Fall, dass die erste Möglichkeit ein neues Array zuweist ( übersetzt zu somearray = somearray + anotherarray )

somearray = ["some", "thing"]

anotherarray = ["another", "thing"]

somearray += anotherarray # => ["some", "thing", "another", "thing"]

somearray = ["some", "thing"]
somearray.concat anotherarray # => ["some", "thing", "another", "thing"]

37voto

g00se0ne Punkte 4360

Versuchen Sie dies, es wird Ihre Arrays kombinieren und Duplikate entfernen

array1 = ["foo", "bar"]
array2 = ["foo1", "bar1"]

array3 = array1|array2

http://www.ruby-doc.org/core/classes/Array.html

Weitere Dokumentation siehe "Set Union".

22voto

slindsey3000 Punkte 3743

(array1 + array2).uniq

Auf diese Weise erhalten Sie die Elemente von array1 zuerst. Sie werden keine Duplikate erhalten.

13voto

samg Punkte 3430

["some", "thing"] + ["another", "thing"]

13voto

juliangonzalez Punkte 3973

In Anlehnung an die Antwort von @Pilcrow lautet die einzige geeignete Antwort für große Arrays concat ( + ), da es schnell ist und kein neues Objekt zugewiesen wird, das in einer Schleife als Müll gesammelt wird.

Hier ist der Benchmark:

require 'benchmark'

huge_ary_1 = Array.new(1_000_000) { rand(5_000_000..30_000_00) }

huge_ary_2 = Array.new(1_000_000) { rand(35_000_000..55_000_00) }

Benchmark.bm do |bm|
  p '-------------------CONCAT ----------------'
  bm.report { huge_ary_1.concat(huge_ary_2) }

  p '------------------- PUSH ----------------'
  bm.report { huge_ary_1.push(*huge_ary_2)  }
end

Ergebnisse:

       user     system      total        real
"-------------------CONCAT ----------------"
  0.000000   0.000000   0.000000 (  0.009388)
"------------------- PUSH ----------------"
  example/array_concat_vs_push.rb:13:in `block (2 levels) in <main>': stack level too deep (SystemStackError)

Wie Sie sehen können, verwenden push wirft einen ERROR : stack level too deep (SystemStackError) wenn die Arrays groß genug sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X