Techioz Blog

Ruby のハッシュ配列を分割する方法

概要

ハッシュの配列を分割したいです。

.split は機能しません。

順序を維持しながら 2 つに分割したいので、.partition、.select、group_by は機能しない可能性があります。

これから何か

allay = [
  {name: "Iron Man", power: "Tech"},
  {name: "Spiderman", power: "Iron Man as Uncle"},
  {name: "Thor", power: "God"},
  {name: "Hawk Eye", power: "None"},
  {name: "Black Widow", power: "love her"}
]

これを出力として

=> [
  [
    {name: "Iron Man", power: "Tech"},
    {name: "Spiderman", power: "Iron Man as an Uncle"},
    {name: "Thor", power: "God"}
  ],
  [
    {name: "Hawk Eye", power: "None"},
    {name: "Black Widow", power: "love her <3"}
  ]
]

解決策

Enumerable#each_slice を使用して、必要な動作を取得できます。

left, right = allay
  .each_slice(allay.length.succ / 2)
  .to_a

もちろん他の方法もありますが、それほど良いものではありません。もう一つは次のとおりです。

pivot = allay.length.succ / 2
left, right = allay
  .partition
  .with_index { |_, i| i < pivot }

そしてもう一つ:

left, right = [], allay.dup
left << right.shift until left.length >= right.length

ベンチマーク!

      each_slice    785.207k (± 5.6%) i/s -      3.920M in   5.006885s
      with_index    694.555k (± 6.6%) i/s -      3.474M in   5.023968s
      push_shift      1.674M (± 6.2%) i/s -      8.343M in   5.004380s
       take_drop      3.468M (± 6.8%) i/s -     17.303M in   5.013369s