Ruby - отображает символы в целые числа в 2d массиве - PullRequest
4 голосов
/ 14 мая 2009

У меня есть проблема, которую я не могу решить ради жизни. Я пишу приложение для Ruby (я работаю на PHP 8 лет, только начинаю с Ruby), которое продает билеты в концертный зал. Каждое место имеет ряд (a ... z) и номер (1 ... x). Модель базы данных имеет строку (строку) и число (int) для каждого места.

Как я могу преобразовать мой массив мест из базы данных в 2d массив? Например, место А1 перейдет в место [1] [1] = «значение»; место C4 будет отображаться на место [3] [4] = значение. Проблема заключается в преобразовании строки строки в Ascii и вычитании смещения? Или есть более простой способ?

Большое спасибо

Ответы [ 3 ]

4 голосов
/ 14 мая 2009

Самый простой способ - использовать хеш. Например: 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}
2 голосов
/ 14 мая 2009

Хорошо, решение, которое я придумаю, похоже, помогает:

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!

1 голос
/ 14 мая 2009

Ну, чтобы получить индекс буквы, вы могли бы сделать что-то вроде этого

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

, который вернул бы 2

Я заметил, что в приведенных вами примерах массивов вы начали A = 1 вместо 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...