In Ruby wie finde ich den index, einer der ein array von Elementen?
In Ruby 2.4 wie finde ich die frühesten index, der ein element eines array in einem anderen array? Das heißt, wenn ein element eines Arrays erfolgt in dem anderen array, ich will den ersten index. Ich dachte find_index könnte es tun, aber
2.4.0 :004 > a = ["a", "b", "c"]
=> ["a", "b", "c"]
2.4.0 :005 > a.find_index("a")
=> 0
2.4.0 :006 > a.find_index(["b", "c"])
=> nil
In dem oben genannten Beispiel, würde ich erwarten, finden Sie in der Ausgabe "1", weil das element "b" erfolgt bei index 1 im array "a".
Sie haben
Sind Sie auf der Suche nach dem ersten vorkommen von
a.find_index("a")
zu finden, der index der "a"
im ["a", "b", "c"]
, also warum machst du a.find_index(["b", "c"])
und nicht a.find_index("b")
zu finden, der index der "b"
? Die a.find_index(["b", "c"])
sucht ein element im array a
, das aussieht wie ["b", "c"]
die gibt es nicht. Das ist ein sub-array kein element.Sind Sie auf der Suche nach dem ersten vorkommen von
b,c
nacheinander, oder einfach den ersten Eintrag im array gegeben?InformationsquelleAutor | 2017-05-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
find_index
nimmt ein einzelnes element. Sie könnten finden, die mindestens etwas zu tun, wiecompact
; ich sehe es sehr oft verwendet, und es scheint klar genug für mich. Auch, fyi[nil,nil,nil].compact.min
zurücknil
. Also keine Ausnahme afaict.Ich stehe korrigiert. Danke. Als er im Irrtum war, habe ich gelöscht meinem früheren Kommentar.
InformationsquelleAutor Alejandro C.
Können Sie
Array#index
mit einem block.Zitat aus der Dokumentation:
Als Cary erläuterte in seinem Kommentar, es ist nicht die performanten Algorithmus zu vergleichen, alle Elemente in
a
gegen alle element in['b', 'c']
(dies würde dazu führen, dassO(n*m)
). Abhängig von der Größe der beiden arrays, wenn vielleicht Sinn, Aufbau einer effizienten Datenstruktur ersten. Mit einemSet
statt eines Arrays hat einige Kosten bei der Schaffung desset
nach vorne, aber macht der Vergleich im block viel schneller (insgesamtO(n+m)
):b = ['b', 'c']
, dies ist besser für das auflisten derb
auf der Suche nach übereinstimmungen ina
. Wenna
undb
enthaltenn
undm
Elemente bzw. das element mit dem indexi
vona
ist das erste Spiel ist ein element vonb
(i <= n
),i*m
Vorgänge erforderlich sind. Wennb
aufgelistet ist, istn*m
Vorgänge erforderlich sind. Dies ist deshalb schneller, aufzählenb
unabhängig vonn
undm
. Wennn*m
groß ist, würde ich vorschlagen, zuerst computingrequire set; sb = b.to_set
, und mitsb.include?(x)
um die Geschwindigkeit, die Bedienung.InformationsquelleAutor spickermann
Können Sie
find_index
und übergeben Sie den gewünschten Wert aus dem array:Können Sie
map
um jedes element in Ihrema
array und dann, um den index des jeweiligen Elements:Andere Art und Weise zu behandeln, könnte es sein, die
Enumerable#each_with_index
:Wenn Sie prüfen wollen, die Indizes für jedes element in
["b", "c"]
mit der["a", "b", "c"]
Arrays können Sie die Karte das erste, das array-Werte, und verwenden Sie dann diea,b,c
überprüft Indizes:Können Sie auch sehen
Array#index
undEnumerable#find_index
.Jemand verschroben. Ich habe dafür gestimmt, bis zur Wiederherstellung des Gleichgewichts im Universum. Ich denke, es ist, weil es nicht um den Aufruf mit einem array.
Die Fragen fragt, für eine einzelne Zahl (ein index) zurückgegeben werden, möglicherweise in nachfolgenden Berechnungen verwendet werden. Sie haben das nicht getan. Ich erwarte, dass das der Grund für den downvote. Auch
a.map{|e| a.find_index(e)}
nichts Wert ist.InformationsquelleAutor Sebastian Palma
Den Sie finden konnten, index aller Elemente von array
b
im arraya
, und finden Sie die min-index zu finden ist der index bei dem ein element vom arrayb
zuerst aufgetreten ist in der Reihea
.Etwas wie unten:
InformationsquelleAutor Wand Maker