我有一个多维数组,其中包含一个字符串和每个元素的另一个数组。
duplicates =
[["link_A", [247936, 672212, 248156, 671720]],
["link_B", [247936, 672212, 248156, 671720]], # Same coordinates as previous line
["link_C", [247936, 672212, 248156, 671720]], # Same coordinates as previous line
["link_D", [247471, 671767, 247567, 671846]],
["link_E", [247471, 671767, 247567, 671846]], # Same coordinates as previous line
["link_F", [247567, 671846, 247775, 671680]],
["link_G", [247567, 671846, 247775, 671680]]] # Same coordinates as previous line
我有我想要的格式的数据,以便使用“ each”遍历“ duplicates”数组并将数据导出到.csv。
此时,我唯一想要的是为每个具有相同坐标的重复项分配一个ID /编号。很高兴将其作为数组中的元素,例如:
所需输出:
duplicates =
[["1", "link_A", [247936, 672212, 248156, 671720]],
["1", "link_B", [247936, 672212, 248156, 671720]], # Same coordinates as previous line
["1", "link_C", [247936, 672212, 248156, 671720]], # Same coordinates as previous line
["2", "link_D", [247471, 671767, 247567, 671846]],
["2", "link_E", [247471, 671767, 247567, 671846]], # Same coordinates as previous line
["3", "link_F", [247567, 671846, 247775, 671680]],
["3", "link_G", [247567, 671846, 247775, 671680]]] # Same coordinates as previous line
最好的方法是什么?
非常感谢。
编辑:
感谢您的回复。当前的3个答案(来自1. Siim Liiser,2。Cary Swoveland和3. iGian)都对我有效,但略有不同(我相信-如果我错了,请纠正我!):
我没有在问题中提到它,但我对重复项本身是变异的还好。我以前曾使用过“ group_by”(下面提供了更多信息)来创建重复项,因此顺序也不重要。再次感谢。
最初的原始数组(在下面称为“ segment_store”)包含链接名称(例如“ link_A”)和一个坐标数组(两个XY坐标)-这些代表链接段。在寻找重复项时,我使用了:
duplicates = segment_store.group_by{|i| i[1]}.select{|k,v| v.length > 1}.values.flatten(1)
获得与原始问题相同的副本(预编辑)。
这是一个使用无限枚举器保存id并使用哈希表来缓存数组首次出现的解决方案。
enum = 1.step
duplicates.each_with_object({}).map do |(string, array), cache|
[cache[array] ||= enum.next, string, array]
end
调用.to_s
第一个元素可获得与您相同的结果。
平均而言,应该是O(n)的时间,且O(n)的额外空间。
不假定重复项是连续的。如果它们在您的示例中始终是连续的,那么不同的算法可能会更节省空间。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句