2

私は多次元配列を持っています:

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

ここで、「f」の「座標」を逆にする必要があります。これは (1,2) である必要があります。「f」がどの「行」にあるかを知らずにこれを行うにはどうすればよいですか? 私は index メソッドを使おうとしてきましたが、これはどこを見るかを伝えた場合にのみ機能します。

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

私は何かを試しました

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

しかし、それは単に nil を返します。

これは可能ですか?

4

5 に答える 5

4

配列のインデックスをループし、必要なものが見つかったら現在のパスを返します。メソッドの例を次に示します。

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
于 2009-02-14T18:20:54.900 に答える
3
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
于 2009-02-14T18:19:33.360 に答える
1

おそらく、配列をループして文字を見つけ、その場所を出力する必要があります。

これは、実際の Ruby ではなく、より一般的なコード スニペットです。しかし、コンセプトはそこにあります。ただし、より良い方法があるかどうかはわかりません。

for(int i = 0; i < 3; i++ ) {
 for(int x = 0; i < 3; x++ ) {
  if( foo[i][x] == 'f' ) {
   print x, i;
  }
 }
}
于 2009-02-14T18:06:22.983 に答える
1

別の方法、娯楽のためだけに:

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

「y = nil」の部分は、ループの前に「y」を定義するだけなので、後で読むことができます...

于 2009-02-14T19:57:55.323 に答える
0

使用できます

foo.flatten

フラット化された配列を取得してから index を使用するには

于 2009-02-14T18:07:12.467 に答える