我有一个包含布尔键的哈希数组,例如
[{"n"=>"img01", "h"=>1},
{"n"=>"img02", "h"=>1},
{"n"=>"img03", "h"=>0},
{"n"=>"img04", "h"=>1}]
我的目标是将具有 h 键以下条件之一的组拆分:[1,1,1]
或[1,0]
或[0,1]
或[1,1]
或单个值(如果这些条件中的任何一个都不可能)。在这个例子中,拆分数组的唯一方法是
[{"n"=>"img01", "h"=>1},{"n"=>"img02", "h"=>1}]
和
[{"n"=>"img03", "h"=>0},{"n"=>"img04", "h"=>1}]
但首先它应该搜索以这种方式完成的数组
[{"n"=>"img01", "h"=>1},
{"n"=>"img02", "h"=>1},
{"n"=>"img03", "h"=>1}]
然后寻找其他组合
我试图将原始数组拼接成 3 组(在测试中只使用了 1 和 0 的数组)
irb(main):030:0> b=a.each_slice(3).to_a => [[0, 1, 1], [1, 1, 0], [0, 0, 0], [0]]
然后将结果先对着最大的数组[1,1,1],如果不行再尝试分裂
irb(main):055:0> (b[0] - [1,1,1]).count => 1
所以移动到下一个子数组最后一个值
irb(main):060:0> b[1].push(b[0].pop)=> [1, 1, 0, 1]
在前两个元素的数组中重复搜索
(irb(main):061:0> b[0] - [1,0]).count
(irb(main):061:0> b[0] - [1,1]).count
(irb(main):061:0> b[0] - [0,1]).count
然后合并另一个子数组,再次拆分,重复搜索,但肯定是乱了
您可以使用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
=> 没有任何内容时10
的宽度为1.0 + 0.5 = 1.5
=> 没有任何内容时01
的宽度为0.5 + 1.0 = 1.5
=> 没有任何内容时11
的宽度为0.5 + 0.5 = 1.0
=> 只有 0.5 适合1
的宽度为0.5
=> 1.0 或 0.5 适合0
的宽度为1.0
=> 只有 0.5 适合您可以111
通过执行找到第一个包含的组image_rows.find { |row| row.size == 3 }
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句