Как я нахожу .index многомерного массива

Изучите , Доктрина 1.2 Доктрины .

реализует Активную Запись. Доктриной 2 + является DataMapper ORM.

кроме того, проверьте Xyster. Это основано на шаблоне Картопостроителя Данных.

кроме того, смотрите на DataMapper по сравнению с Активной Записью .

9
задан Matt 5 December 2009 в 01:29
поделиться

6 ответов

a.each_index { |i| j = a[i].index 'S'; p [i, j] if j }

Обновление: ОК, мы можем вернуть несколько совпадений. Вероятно, лучше всего использовать основной API как можно больше, чем выполнять итерацию один за другим с интерпретируемым кодом Ruby, поэтому давайте добавим несколько выходов по короткому замыканию и итерационных вычислений, чтобы разбить строку на части. На этот раз он организован как метод экземпляра в Array и возвращает массив [row, col] подмассивы.

a = [ %w{ a b c d },
      %w{ S },
      %w{ S S S x y z },
      %w{ S S S S S S },
      %w{ x y z S },
      %w{ x y S a b },
      %w{ x },
      %w{ } ]

class Array
  def locate2d test
    r = []
    each_index do |i|
      row, j0 = self[i], 0
      while row.include? test
        if j = (row.index test)
          r << [i, j0 + j]
          j  += 1
          j0 += j
          row = row.drop j
        end
      end
    end
    r
  end
end

p a.locate2d 'S'
5
ответ дан 4 December 2019 в 08:01
поделиться

Это сделает это:

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

p array.index(array.detect{|aa| aa.include?('S')}) # prints 1

Если вам также нужен индекс 'S в подмассиве, вы можете:

row = array.detect{|aa| aa.include?('S')}
p [row.index('S'), array.index(row)] # prints [1,1]
12
ответ дан 4 December 2019 в 08:01
поделиться

Вы можете найти первое, в котором находится абсолютная позиция, сгладив массив:

pos = array.flatten.index('S')

Затем получите количество столбцов в строке:

ncols = array.first.size

затем

row = pos / ncols

col = pos % ncols
4
ответ дан 4 December 2019 в 08:01
поделиться

Не -Руби-конкретный ответ: вы пытаетесь напечатать "S" в обоих примерах, но только последний имеет "S" в массиве. Первый имеет ['x', 'S', '', 'x']. Что вам нужно сделать (если Ruby не делает этого за вас), так это посмотреть на каждый член в массиве и найти в нем «S». Если в этом элементе содержится «S», выведите его.

x ',' S ',' ',' x ']. Что вам нужно сделать (если Ruby не делает этого за вас), так это посмотреть на каждый член в массиве и найти в нем «S». Если в этом элементе содержится «S», выведите его.

x ',' S ',' ',' x ']. Что вам нужно сделать (если Ruby не делает этого за вас), так это посмотреть на каждый член в массиве и найти в нем «S». Если в этом элементе содержится «S», выведите его.

0
ответ дан 4 December 2019 в 08:01
поделиться
array = [['x', 'x',' x','x'],
         ['x', 'S',' ','x'],
         ['x', 'x',' x','x']]
class Array
  def my_index item
    self.each_with_index{|raw, i| return i if raw.include? item}
    return
  end
end

p array.my_index("S") #=>1
p array.my_index("Not Exist Item") #=> nil
0
ответ дан 4 December 2019 в 08:01
поделиться

Задает оба индекса первого вхождения элемента за один проход на подмассивах

a = [[...],[...],[...],[...]]
element = 'S'
result_i = result_j = nil

a.each_with_index do|row, i|
    if (j = row.index(element))
        result_i, result_j = i, j       
        break
    end
end
0
ответ дан 4 December 2019 в 08:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: