我有一个包含布尔键的哈希数组,比如
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
然后合并其他子数组,再次拆分并重复搜索,但绝对是 搞砸了
答案 0 :(得分:2)
您可以使用1
和0
作为虚构图像宽度的排序。假设水平图像是垂直图像宽度的两倍。
然后,您可以继续使用它来计算当前图像行上的图像的宽度,并且下一个图像是否仍然适合该行。
当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 }
的第一个群组。