4

私には一生解決できない問題があります。私は、コンサート ホールのチケットを販売する Ruby アプリを作成しています (Ruby から始めて 8 年間 PHP 開発者をしています)。各座席には行 (a...z) と番号 (1...x) があります。データベース モデルには、座席ごとに行 (string) と num (int) があります。

座席の配列をデータベースから 2D 配列に変換するにはどうすればよいですか? たとえば、座席 A1 は、seat[1][1] = "value"; に移動します。座席 C4 は、座席 [3][4] = 値にマップされます。問題は、行文字列を Ascii に変換し、オフセットを減算することですか? それとももっと簡単な方法がありますか?

どうもありがとう

4

3 に答える 3

4

おそらく最も簡単な方法は、代わりにハッシュを使用することです。例えば:seat['A'][1] = value

しかし、何らかの理由で本当に配列が必要な場合は、説明する方法が最も簡単です。行文字列が「A」から「Z」までの単一文字であると仮定すると、row_string[0] - ?A(またはrow_string[0] - ?A + 1、例のように1から始まるインデックスが必要な場合)を使用して実行できます。行 AA が行 Z の後にある複数文字バージョンの場合、1.8.7 以降でこれを行うことができます。

row_num = row_string.bytes.inject(0) {|total, x| total = total * 26 + x - ?A + 1}

安全のために、行文字列を事前に大文字にすることをお勧めします。

1.8.6 以下でStringは、メソッドがありませんbytes。次のようにして、同じことを達成できます。

row_num = 0
row_string.each_byte {|x| row_num = row_num * 26 + x - ?A + 1}
于 2009-05-14T16:09:36.183 に答える
2

わかりました、私が思いついた解決策はうまくいくようです:

seat_array = Hash.new{|h,k| h[k]=Hash.new(&h.default_proc) }
for seat in self.seats
seat_array[seat.row.downcase][seat.num] = seat
end 
return seat_array

このような迅速で有用な回答をくださった皆様に感謝します。私は確かにPHPで他の人を助けます!

于 2009-05-14T17:03:35.443 に答える
1

文字のインデックスを取得するには、次のようにすることができます

('A'..'Z').to_a.index('C')

これは 2 を返します

あなたが与えた配列の例で、0 ではなく A = 1 を開始していることに気付きました。

于 2009-05-14T16:13:01.277 に答える