比较 Ruby 中二维数组的子数组,并显示结果数组与现有和遗漏的项目
Posted
技术标签:
【中文标题】比较 Ruby 中二维数组的子数组,并显示结果数组与现有和遗漏的项目【英文标题】:Compare subarrays of 2-dimensional array in Ruby and show result array with existing and missed items 【发布时间】:2021-11-23 03:09:06 【问题描述】:你有一个二维字符串数组:
[
["AAA", "BBB", "CCC", "DDD"],
["BBB", "CCC", "DDD"],
["AAA", "CCC", "DDD"],
["AAA", "CCC", "DDD", "EEE"]
]
您需要将每个子数组与其他子数组进行比较,以获得二维数组的结果,该数组将显示每个子数组中是否存在每个字符串(如果不存在 - 它应该是 nil)这(结果):
[
["AAA", nil, "AAA", "AAA"],
["BBB", "BBB", nil, nil],
["CCC", "CCC", "CCC", "CCC"],
["DDD", "DDD", "DDD", "DDD"],
[nil, nil, nil, "EEE"]
]
如何编写一个函数,该函数接受一个初始数组并像 RESULT 示例那样返回数组?
【问题讨论】:
那么问题是什么?分享您的想法/代码/发现。你在哪里卡住了? 我理解你的问题,但我知道准确地表达它是一个挑战。我建议你解释一下有两个步骤。让arr
成为给定的数组。第一步是创建一个数组a
,其中包含arr.flatten
中所有唯一元素的出现顺序。然后,您希望创建一个数组b
,其中包含a.size
大小为arr.size
的数组,如果arr[j]
包含a[i]
,则b[i][j]
等于a[i]
,否则它等于nil
。请注意,一旦您对问题有了准确的陈述,解决方案就变得简单明了。
【参考方案1】:
arr = [
["AAA", "BBB", "CCC", "DDD"],
["BBB", "CCC", "DDD"],
["AAA", "CCC", "DDD"],
["AAA", "CCC", "DDD", "EEE"]
]
all = arr.reduce(:|)
#=> ["AAA", "BBB", "CCC", "DDD", "EEE"]
arr.map |row| all.map |s| row.include?(s) ? s : nil .transpose
#=> [["AAA", nil, "AAA", "AAA"],
# ["BBB", "BBB", nil, nil],
# ["CCC", "CCC", "CCC", "CCC"],
# ["DDD", "DDD", "DDD", "DDD"],
# [ nil, nil, nil, "EEE"]]
请参阅Array#|(数组联合)计算all
。
transpose
的接收者等于
arr.map |row| all.map |s| row.include?(s) ? s : nil
#=> [["AAA", "BBB", "CCC", "DDD", nil],
# [ nil, "BBB", "CCC", "DDD", nil],
# ["AAA", nil, "CCC", "DDD", nil],
# ["AAA", nil, "CCC", "DDD", "EEE"]]
【讨论】:
【参考方案2】:如果列表有下一个值:
list = [
["AAA", "BBB", "CCC", "DDD"],
["BBB", "CCC", "DDD"],
["AAA", "CCC", "DDD"],
["AAA", "CCC", "DDD", "EEE"]
]
然后
def method_name(list)
handled_list = list.flatten.uniq
handled_list.each_with_object([]) do |item, res|
res << list.map |sub_array| sub_array.find |s| s == item
end
end
【讨论】:
以上是关于比较 Ruby 中二维数组的子数组,并显示结果数组与现有和遗漏的项目的主要内容,如果未能解决你的问题,请参考以下文章