Ruby - 将字符映射到2d数组中的整数

时间:2009-05-14 15:38:20

标签: ruby arrays map

我有一个问题我不能为我的生活解决。我正在编写一个Ruby应用程序(我已经是一个PHP开发人员已经8年了,刚开始使用Ruby),它出售了音乐厅的门票。每个座位都有一行(a ... z)和一个数字(1 ... x)。数据库模型的每个席位都有行(字符串)和num(int)。

如何将数据库中的席位数组转换为二维数组?例如,座位A1将进入座位[1] [1] =“价值”;座位C4将映射到座位[3] [4] =值。问题是将行字符串转换为Ascii并减去偏移量?或者有更简单的方法吗?

非常感谢

3 个答案:

答案 0 :(得分: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}

答案 1 :(得分: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帮助别人!

答案 2 :(得分:1)

要获得一封信的索引,你可以做这样的事情

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

将返回2

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