2017-08-04 3 views
0

sollte die Indizes des Wortes 'hello' zum indices Array hinzufügen, aber es ist das Hinzufügen sie nicht auf das Array:Wie findet man alle Indizes eines bestimmten Elements in einem Array? Dieser Code

words = %w(hello how are you then okay then hello how) 

def global(arg1, arg2) 
    indices = [] 
    arg1.each do |x, y| 
    indices << y if arg2 == x 
    end 
    indices 
end 

global(words,'hello') 
#=> [nil, nil] 

Was mit meinem Code falsch?

+1

'wenn arg1 == x' - Ein Array wird nie einem seiner Elemente entsprechen, daher ist diese Bedingung niemals wahr. Deshalb bekommst du keine Indizes. Meintest du 'if arg2 == x'? –

+4

Wenn Sie bessere, aussagekräftigere Namen für Ihre Argumente hätten, wäre dieser Fehler nicht passiert. –

+3

Auch "each_index" anstelle von "jeder". –

Antwort

4

Einige andere Möglichkeiten, die Katze zu häuten.

Traverse each_indexselect und diejenigen, deren Element die gesuchte Wort entsprechen:

def indices(words, searched_word) 
    words.each_index.select { |index| words[index] == searched_word } 
end 

Traverse jedes Wort zusammen mit seinem Index (each_with_index) und speichert den Index in einem expliziten indices Array, wenn das Wort übereinstimmt. Dann kehren die indices Array:

def indices(words, searched_word) 
    indices = [] 
    words.each_with_index do |word, index| 
    indices << index if word == searched_word 
    end 
    indices 
end 

Wie oben, aber die explizite Array übergeben rechts in die Iteration über with_object (was auch das Array zurück):

def indices(words, searched_word) 
    words.each_with_index.with_object([]) do |(word, index), indices| 
    indices << index if word == searched_word 
    end 
end 
1
def indices(words, searched_word) 
    words.each_with_index.select { |word, _| word == searched_word }.map(&:last) 
end 

words = %w(hello how are you then okay then hello how) 

indices words, 'hello' # => [0, 7] 
Verwandte Themen