在已知片段中拆分数组

时间:2018-06-13 11:56:37

标签: arrays ruby split

我有一个包含布尔键的哈希数组,比如

BooleanField

我的目标是拆分具有以下h键条件之一的组:   如果无法满足任何条件,则if user.item.purchase.status: # ... pass [{"n"=>"img01", "h"=>1}, {"n"=>"img02", "h"=>1}, {"n"=>"img03", "h"=>0}, {"n"=>"img04", "h"=>1}] [1,1,1][1,0]或单一值。在此示例中,拆分数组的唯一方法是

[0,1]

[1,1]

但首先它应该搜索以这种方式完成的数组

     [{"n"=>"img01", "h"=>1},{"n"=>"img02", "h"=>1}] 

然后寻找其他组合

我试图将原始数组拼接成3组(在测试中仅使用1和0的数组)

     [{"n"=>"img03", "h"=>0},{"n"=>"img04", "h"=>1}]

然后将结果首先面对最大阵列[1,1,1],然后尝试再次分裂

          [{"n"=>"img01", "h"=>1},
           {"n"=>"img02", "h"=>1},
           {"n"=>"img03", "h"=>1}] 

所以移动到下一个子数组的最后一个值

 irb(main):030:0> b=a.each_slice(3).to_a => [[0, 1, 1], [1, 1, 0], [0, 0, 0], [0]]

在前两个元素数组中重复搜索

 irb(main):055:0> (b[0] -  [1,1,1]).count => 1

然后合并其他子数组,再次拆分并重复搜索,但绝对是  搞砸了

1 个答案:

答案 0 :(得分:2)

您可以使用10作为虚构图像宽度的排序。假设水平图像是垂直图像宽度的两倍。

然后,您可以继续使用它来计算当前图像行上的图像的宽度,并且下一个图像是否仍然适合该行。

width + next element width大于适合"一行图像"时,您会开始一个新行。

示例:

input = [{"n"=>"img01", "h"=>1},
   {"n"=>"img02", "h"=>1},
   {"n"=>"img03", "h"=>0},
   {"n"=>"img04", "h"=>1}]

image_rows = []
current_row = []
current_width = 0.0
input.each.with_index(1) do |image_data, idx|

  image_width = image_data['h'] == 1 ? 0.5 : 1.0

  if current_width + image_width > 1.5
    image_rows << current_row
    current_row = [image_data]
    current_width = image_width
  else
    current_row << image_data
    current_width += image_width
  end

  if idx == input.size
    image_rows << current_row
  end
end

require 'json'
puts JSON.pretty_generate(image_rows)

输出:

[
  [
    {
      "n": "img01",
      "h": 1
    },
    {
      "n": "img02",
      "h": 1
    }
  ],
  [
    {
      "n": "img03",
      "h": 0
    },
    {
      "n": "img04",
      "h": 1
    }
  ]
]
  • 当前行有111时,宽度为0.5 + 0.5 + 0.5 = 1.5 =&gt;
  • 当前行有10时,宽度为1.0 + 0.5 = 1.5 =&gt;
  • 当前行有01时,宽度为0.5 + 1.0 = 1.5 =&gt;
  • 当前行有11时,宽度为0.5 + 0.5 = 1.0 =&gt;只有0.5适合
  • 当前行有1时,宽度为0.5 =&gt; 1.0或0.5适合
  • 当前行有0时,宽度为1.0 =&gt;只有0.5适合

您可以通过111找到包含image_rows.find { |row| row.size == 3 }的第一个群组。