【问题标题】:Ruby - Map characters to integers in 2d arrayRuby - 将字符映射到二维数组中的整数
【发布时间】:2010-10-26 05:34:47
【问题描述】:

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

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

非常感谢

【问题讨论】:

  • 为什么要将行转换为整数?你可以把字符串放在那里。
  • 谢谢马特。不确定我明白吗?如果我尝试做 seat[seat.row][seat.num] = value 我得到一个 TypeError 无法将字符串转换为整数。因此我假设数组仅按整数索引,所以需要转换?
  • @Dan:Ruby 有哈希,这与 PHP 的关联数组很相似。它们的索引方式与数组相同(请参阅我的答案),但空哈希表示为 {} 而不是 []。

标签: ruby arrays map


【解决方案1】:

好的,我想出的解决方案似乎可以解决问题:

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】:

    要获得一个字母的索引,你可以这样做

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

    这将返回 2

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

    【讨论】:

      【解决方案3】:

      最简单的方法可能是使用散列代替。例如: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}
      

      【讨论】:

      • 我同意,哈希是处理这个问题的最佳方式。
      • 非常感谢。哈希当然是最简单的方法。但是: outs = {} for seat in self.seats outs[seat.num][seat.row] = "yes" end return outs 产生在评估 nil.[]= 时发生错误。 seat.row 和 seat.num 都有断言值,所以我猜它一定是语法错误。感谢您的所有帮助。
      • 这不是语法错误,您只需要在尝试为其分配元素之前为每一行创建数组。试试这个: outs = {};用于self.seats中的座位;出局[seat.num] ||= []; outs[seat.num][seat.row] = "是";如果 outs[seat.num] 还没有值,“outs[seat.num] ||= []”行将设置 outs[seat.num] 为空数组。此外,您最好使用 true 而不是“yes”。
      猜你喜欢
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      • 2016-11-22
      相关资源
      最近更新 更多