Как я могу вернуть координаты / индексы строки в многомерном массиве? [Рубин] - PullRequest
2 голосов
/ 14 февраля 2009

У меня есть многомерный массив:

foo = [["a","b","c"], ["d", "e", "f"], ["g", "h", "i"]]

Теперь мне нужно повернуть «координаты» «f», которые должны быть (1,2). Как я могу сделать это, не зная, в каком «ряду» находится «f»? Я пытался использовать метод индекса, но он работает только тогда, когда я говорю ему, где искать, т.е.

foo[1].index("f")  #=>2

Я пробовал что-то вроде

foo[0..2][0..2].index("f")

но это просто возвращает ноль.

Возможно ли это?

Ответы [ 5 ]

4 голосов
/ 14 февраля 2009

Перебирайте индексы массива и возвращайте текущий путь, когда вы найдете то, что хотите. Вот пример метода:

def find2d(array, elem)
  array.each_with_index do |row, row_idx|
    row.each_with_index do |col, col_idx|
      return [row_idx, col_idx] if col == elem
    end
  end
end
3 голосов
/ 14 февраля 2009
foo.each_with_index do |item, index|
  if item.index('f')
    // the array number that 'f' is in
    puts "Array number: #{index}"
    // the index in that array of the letter 'f'
    puts item.index('f')
  end
end
1 голос
/ 14 февраля 2009

Другой способ, просто для развлечения:

y = nil
x = (0...foo.size).find {|xi| y = foo[xi].index("f")}

Часть "y = nil" просто определяет "y" перед циклом, чтобы вы могли прочитать его потом ...

1 голос
/ 14 февраля 2009

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

Это скорее фрагмент общего кода, а не настоящий ruby. Но концепция есть. Не знаю, есть ли лучший способ.

for(int i = 0; i < 3; i++ ) {
 for(int x = 0; i < 3; x++ ) {
  if( foo[i][x] == 'f' ) {
   print x, i;
  }
 }
}
0 голосов
/ 14 февраля 2009

Вы можете использовать

foo.flatten

Чтобы получить плоский массив, а затем использовать индекс

...