Ruby中对比二维数组子数组并返回含存在及缺失项的结果数组
Ruby 实现数组存在性标记转换函数
实现逻辑
- 提取输入二维数组中所有出现过的字符串,去重后按字母序排序,作为结果数组的行维度基准
- 逐行处理每个唯一字符串,依次校验该字符串是否存在于输入的每一个子数组中:存在则保留原字符串,不存在则填充
nil - 所有行的处理结果组合即为最终返回的二维数组
基础实现代码
def transform_array(input_arr) # 提取全量唯一字符串并按字母序排序 unique_strs = input_arr.flatten.uniq.sort # 逐行生成结果 unique_strs.map do |str| input_arr.map { |sub_arr| sub_arr.include?(str) ? str : nil } end end
优化实现(适用于大规模输入)
如果输入的子数组长度较长、数量较多,可以提前将子数组转为集合降低存在性查询的时间复杂度:
def transform_array(input_arr) # 预转集合优化查询效率 sub_arr_sets = input_arr.map(&:to_set) input_arr.flatten.uniq.sort.map do |str| sub_arr_sets.map { |set| set.include?(str) ? str : nil } end end
测试验证
# 测试输入 input = [ ["AAA", "BBB", "CCC", "DDD"], ["BBB", "CCC", "DDD"], ["AAA", "CCC", "DDD"], ["AAA", "CCC", "DDD", "EEE"] ] # 调用函数输出结果 pp transform_array(input) # 输出符合预期: # [ # ["AAA", nil, "AAA", "AAA"], # ["BBB", "BBB", nil, nil], # ["CCC", "CCC", "CCC", "CCC"], # ["DDD", "DDD", "DDD", "DDD"], # [nil, nil, nil, "EEE"] # ]
内容的提问来源于stack exchange,提问作者ruby_dev
相关产品推荐
相关产品推荐

