比较 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 中二维数组的子数组,并显示结果数组与现有和遗漏的项目的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby 中创建二维数组和访问子数组

如何将二维数组中的值与 GoLang 中的一维数组中的值进行比较?

与多维数组 ruby​​ 的数组值比较

获取具有特定键/值对的二维数组中的子数组

返回一个二维整形数组的子数组的最大和

jQuery循环遍历多维数组并显示每个父数组的子数组