首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将哈希转换为一个或多个数组?

如何将哈希转换为一个或多个数组?
EN

Stack Overflow用户
提问于 2012-05-23 09:46:32
回答 2查看 171关注 0票数 1

我想不出如何将哈希转换成多维数组。在读取Excel电子表格后,我从roo生成了以下哈希:

代码语言:javascript
复制
{[1, 1]=>"string-1", [1, 2]=>"string-2", [1, 3]=>"string-3", [1, 4]=>"string-4", 
[1, 5]=>"string-5", [1, 6]=>"string-6", [1, 7]=>"string-7", [2, 1]=>"string-1", 
[2, 2]=>"string-2", [2, 3]=>numeric-1, [2, 4]=>numeric-2, [2, 5]=>"string-3", 
[2, 6]=>"string-4", [2, 7]=>numeric-3, [3, 1]=>"string-1", [3, 2]=>"string-2", 
[3, 3]=>numeric-1, [3, 4]=>numeric-2, [3, 5]=>"string-3", [3, 6]=>"string-4", 
[3, 7]=>numeric-3, ... etc}

我需要将其转换为:

代码语言:javascript
复制
[["string-1", "string-2", "string-3", "string-4", "string-5", "string-6", "string-7"], 
["string-1", "string-2", numeric-1, numeric-2, "string-3", "string-4", numeric-3], 
["string-1", "string-2", numeric-1, numeric-2, "string-3", "string-4", numeric-3],
... etc]

我尝试了以下方法,但它只是将所有内容复制到一个数组中,而不是嵌入式数组:

代码语言:javascript
复制
2.upto(input.last_row).each do |row|
  ((input.first_column)..(input.last_column)).map{ |col| 
    $rows << input.cell(row, col) if col != 5 and col <= 10}.join(" ")
end

我已经寻找了几个小时的答案,但没有找到一个解决方案。

以下是我的可行解决方案:

代码语言:javascript
复制
((xlsx.first_row)..(xlsx.last_row)).each do |row|
  ((xlsx.first_column)..(xlsx.last_column)).each do |col|
    $tmp_row << xlsx.cell(row, col) if col != 5 and col <= 10
  end
remove_newlines_from_strings($tmp_row)
$rows_sheet_0 << $tmp_row
$tmp_row = []
end
EN

回答 2

Stack Overflow用户

发布于 2012-05-23 10:11:05

如果您使用的是1.9+,那么您可以利用有序哈希,如下所示:

代码语言:javascript
复制
a_of_as = spreadsheet.group_by { |k, v| k.first }.map { |k, v| v.map(&:last) }

如果您不确定Hash将以正确的顺序构建,那么您可以强制执行“按坐标排序”,如下所示:

代码语言:javascript
复制
a_of_as = spreadsheet.sort_by  { |k, v| k }
                     .group_by { |k, v| k.first }
                     .map      { |k, v| v.map(&:last) }

我假设网格中没有任何间隙,但在处理电子表格时,这似乎是一个安全的假设。

例如(为紧凑而重新格式化):

代码语言:javascript
复制
>> pp spreadsheet
{[1, 1]=>"string-1", [1, 2]=>"string-2", [1, 3]=>"string-3",  [1, 4]=>"string-4",  [1, 5]=>"string-5", [1, 6]=>"string-6", [1, 7]=>"string-7",
 [2, 1]=>"string-1", [2, 2]=>"string-2", [2, 3]=>"numeric-1", [2, 4]=>"numeric-2", [2, 5]=>"string-3", [2, 6]=>"string-4", [2, 7]=>"numeric-3",
 [3, 1]=>"string-1", [3, 2]=>"string-2", [3, 3]=>"numeric-1", [3, 4]=>"numeric-2", [3, 5]=>"string-3", [3, 6]=>"string-4", [3, 7]=>"numeric-3"}

>> pp spreadsheet.group_by { |k, v| k.first }.map { |k, v| v.map(&:last) }
[["string-1", "string-2", "string-3",  "string-4",  "string-5", "string-6", "string-7"],
 ["string-1", "string-2", "numeric-1", "numeric-2", "string-3", "string-4", "numeric-3"],
 ["string-1", "string-2", "numeric-1", "numeric-2", "string-3", "string-4", "numeric-3"]]

>> spreadsheet2 = Hash[spreadsheet.sort { |(ka,va),(kb,vb)| kb <=> ka }]
>> pp spreadsheet2
{[3, 7]=>"numeric-3", [3, 6]=>"string-4", [3, 5]=>"string-3", [3, 4]=>"numeric-2", [3, 3]=>"numeric-1", [3, 2]=>"string-2", [3, 1]=>"string-1", 
 [2, 7]=>"numeric-3", [2, 6]=>"string-4", [2, 5]=>"string-3", [2, 4]=>"numeric-2", [2, 3]=>"numeric-1", [2, 2]=>"string-2", [2, 1]=>"string-1",
 [1, 7]=>"string-7",  [1, 6]=>"string-6", [1, 5]=>"string-5", [1, 4]=>"string-4",  [1, 3]=>"string-3",  [1, 2]=>"string-2",  [1, 1]=>"string-1"}

>> pp spreadsheet2.sort_by { |k,v| k }.group_by { |k, v| k.first }.map { |k, v| v.map(&:last) }
[["string-1", "string-2", "string-3",  "string-4",  "string-5", "string-6", "string-7"],
 ["string-1", "string-2", "numeric-1", "numeric-2", "string-3", "string-4", "numeric-3"],
 ["string-1", "string-2", "numeric-1", "numeric-2", "string-3", "string-4", "numeric-3"]]
票数 1
EN

Stack Overflow用户

发布于 2012-05-23 10:18:25

代码语言:javascript
复制
h = {[1, 1]=>"string-1",[1, 2]=>"string-2",[1, 3]=>"string-3",[1, 4]=>"string-4",
[1,5]=>"string-5",[1, 6]=>"string-6",[1, 7]=>"string-7",[2, 1]=>"string-1",
[2, 2]=>"string-2",[2, 3]=>"numeric-1",[2, 4]=>"numeric-2",[2, 5]=>"string-3",
[2, 6]=>"string-4",[2, 7]=>"numeric-3",[3, 1]=>"string-1",[3, 2]=>"string-2",
[3, 3]=>"numeric-1",[3, 4]=>"numeric-2",[3, 5]=>"string-3",[3, 6]=>"string-4",
[3, 7]=>"numeric-3"}

h.each_with_object(Hash.new([])){ |m,res| res[m.first.first] += [m.last] }.values

#=>[["string-1","string-2","string-3","string-4","string-5","string-6","string-7"],
#=> ["string-1","string-2","numeric-1","numeric-2","string-3","string-4","numeric-3"],
#=> ["string-1","string-2","numeric-1","numeric-2","string-3","string-4","numeric-3"]]

多亏了mu is too short的提示,我可以重写一下:

代码语言:javascript
复制
h.each_with_object(Hash.new{|h,k|h[k]=[]}) do |m,res| 
  res[m.first.first] << m.last 
end.values
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10712464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档