4

我有一个我一辈子都解决不了的问题。我正在编写一个销售音乐厅门票的 Ruby 应用程序(我已经做了 8 年的 PHP 开发人员,只是从 Ruby 开始)。每个座位都有一排 (a...z) 和一个数字 (1...x)。数据库模型对每个座位都有 row (string) 和 num (int)。

如何将数据库中的座位数组转换为二维数组?例如,座位 A1 将进入座位[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

我注意到在您给您的数组示例中,A = 1 而不是 0。

于 2009-05-14T16:13:01.277 回答