簡體   English   中英

Ruby:在哈希中分配數組值

[英]Ruby: Assigning array values in a hash

我想要以下哈希輸出:

{ 0 => [0,1,2], 1 => [0,1,2], 2 => [0,1,2],
  3 => [3,4,5], 4 => [3,4,5], 5 => [3,4,5],
  6 => [6,7,8], 7 => [6,7,8], 8 => [6,7,8]
}

憑直覺我可以將這些值硬編碼,但是我很難弄清楚如何將每個哈希鍵動態分配給適當的數組值。例如,也許創建一個9.times循環?

{ 0 => (0..2).to_a, 1 => (0..2).to_a, 2 => (0..2).to_a,
  3 => (3..5).to_a, 4 => (3..5).to_a, 5 => (3..5).to_a, 
  6 => (6..8).to_a, 7 => (6..8).to_a, 8 => (6..8).to_a 
}

感謝您的指導

使用模運算( % ),您可以計算子數組的值:

(0..8).map { |i| [i, (i - i%3 .. i - i%3 + 2).to_a] }.to_h

# => {0=>[0, 1, 2], 1=>[0, 1, 2], 2=>[0, 1, 2], 3=>[3, 4, 5], 4=>[3, 4, 5], 5=>[3, 4, 5], 6=>[6, 7, 8], 7=>[6, 7, 8], 8=>[6, 7, 8]}

具有動態上限:

count, split = 9, 3
0.upto(count - 1).map do |i|
  [i, [*(i / split * split)...(i / split) * split + split]]
end.to_h

也許是這樣的:

[0..2, 3..5, 6..8].each.with_object({}) do |range, result|
  range.each do |ind|
    result[ind] = range.to_a
  end
end
dummy_data = {}
(0..8).to_a.each_slice(3).map{ |m| m.each{|v| dummy_data[v] = m }}

它生成預期的偽數據

dummy_data
 => {0=>[0, 1, 2], 1=>[0, 1, 2], 2=>[0, 1, 2], 3=>[3, 4, 5], 4=>[3, 4, 5], 5=>[3, 4, 5], 6=>[6, 7, 8], 7=>[6, 7, 8], 8=>[6, 7, 8]} 
def make_da_hash(n)
  a = (0..n*n-1).to_a
  a.zip(a.each_slice(n).flat_map { |e| [e]*n }).to_h
end

make_da_hash(3)
  #=> {0=>[0, 1, 2], 1=>[0, 1, 2], 2=>[0, 1, 2],
  #    3=>[3, 4, 5], 4=>[3, 4, 5], 5=>[3, 4, 5],
  #    6=>[6, 7, 8], 7=>[6, 7, 8], 8=>[6, 7, 8]} 

make_da_hash(4)
  #=> {0=>[0, 1, 2, 3], 1=>[0, 1, 2, 3], 2=>[0, 1, 2, 3], 3=>[0, 1, 2, 3],
  #    4=>[4, 5, 6, 7], 5=>[4, 5, 6, 7], 6=>[4, 5, 6, 7], 7=>[4, 5, 6, 7],
  #    8=>[8, 9, 10, 11], 9=>[8, 9, 10, 11], 10=>[8, 9, 10, 11],
  #    11=>[8, 9, 10, 11], 12=>[12, 13, 14, 15], 13=>[12, 13, 14, 15],
  #    14=>[12, 13, 14, 15], 15=>[12, 13, 14, 15]} 
{}.merge(*Array.new(3){|i| (0..8).group_by{|n| n / 3 * 3 + i}})  

輸出:

{
  0=>[0, 1, 2],
  3=>[3, 4, 5],
  6=>[6, 7, 8],
  1=>[0, 1, 2],
  4=>[3, 4, 5],
  7=>[6, 7, 8],
  2=>[0, 1, 2],
  5=>[3, 4, 5],
  8=>[6, 7, 8]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM