2016-09-19 3 views
0

Я пытаюсь найти индексы, в которых определенная строка находится в многомерном массиве в Ruby. Я использую следующий код.Найти несколько индексов в многомерном массиве

array = [['x', 'x',' x','x'], 
     ['x', 'S',' ','x'], 
     ['x', 'x','x','S']] 

array.index(array.detect{|aa| aa.include?('S')} 

Однако это возвращает 1 (первый индекс). Кто-нибудь знает, как я могу изменить эту команду, чтобы вернуть все индексы, в которых присутствует шаблон? Этот пример должен вернуть 1 и 2.

+0

Вопрос «За наступление» не будет отклонен. Это просто означает, что вы должны отредактировать вопрос для разрешения возражения. Если редактирование будет удовлетворительным, трюк будет удален. –

+0

Я выдвигаю этот вопрос для повторного открытия. Измененный вопрос включает входные данные, подход, который не работает, и ожидаемый результат. И, откровенно говоря, это произошло, когда пришли последние 2 закрытых голоса ... –

ответ

2

Вот обновленное решение теперь, когда вы обновили свой вопрос и добавил комментарий ниже:

array.each_index.select { |i| array[i].include?('S') } 
#=> [1, 2] 
+0

Спасибо, я отредактировал оригинал, потому что понял, что индексы массива и подмассива были одинаковыми, что может вызвать некоторую путаницу. Итак, я хочу индексы подмассивов, содержащих строку. Меня не интересует местоположение в каждом подмассиве. Тем не менее, я получаю тот же ответ, когда я использую оба ваших решения, что [nil, 1, 3]. – kms

+0

@kms Обновлено, теперь это делает то, что вы хотите –

0

Один из способов:

array = [['x', 'x',' x','x'], 
     ['x', 'S',' ','x'], 
     ['x', 'x','x','S']] 

array.each_with_index.with_object([]) do |(row,i),arr| 
    j = row.index('S') 
    arr << i unless j.nil? 
end 
    #=> [1, 2] 

Это лишь небольшое изменение для получения индексов строк и столбцов (при условии, что в строке не более одной целевой строки):

array.each_with_index.with_object([]) do |(row,i),arr| 
    j = row.index('S') 
    arr << [i,j] unless j.nil? 
end 
    #=> [[1, 1], [2, 3]] 

Вы также можете использовать класс Matrix для получения пар строк/столбцов.

require 'matrix' 

Matrix[*array].each_with_index.with_object([]) { |(e,i,j),arr| arr << [i,j] if e == 'S' } 
    #=> [[1, 1], [2, 3]] 
+0

Не думаете ли вы, что 'each.with_index.with_object ([]) 'имеет симметрию симметрии (т. е. просто цепляет все методы' Enumerable')? :) –

+0

@MichaelKohl, да, хотя пока вы пока не показываете ... :-) –

+0

Ух, я снова написал «Перечислить», когда Я имел в виду «Перечислитель». Однажды я получу это правильно ...;) –

Смежные вопросы