检查多个位置的值并仅在源是唯一的时返回匹配项

假设我有一个 供应商列表:Asda、Tesco、Spar。

还有一个 来源列表(或类比中的供应商):Kellogg、Cadbury、Nestle、Johnsons、Pampers、Simple 等(有一个约 20 个定义的列表)。

在数据流中的别处,我返回一个结果,即对于每个供应商,针对多个不同的事物是否是 Yes/No。

例如:Asda:ukOnly="Yes";Spar:ukOnly="No" 等。

在这个特定的部分,我正在搜集结果。

大多数情况下,如果供应商的来源重叠,那么这对我没有太大影响。因此,我可以说:

function concatResults(x) -- 对"x"的结果进行连接,即每个供应商的结果
 local pathAsda = *这是我调用特定于 Asda 的路径位置的地方*
 local pathTesco = *这是我调用特定于 Tesco 的路径位置的地方*
 local pathSpar = *这是我调用特定于 Spar 的路径位置的地方*
   if (pathAsda == "Yes" or pathTesco == "Yes" or pathSpar == "Yes") then
    return "Yes"
   else
    return "No"
   end
end

ukOnlyAgr = concatResults("ukOnly")

太好了!

现在,假设我想做一些更复杂的事情。

我想知道有多少唯一的供应商提供巧克力和谷物。下面的示例正在被用于进一步的过程中,以产生一个事实 suppliesSweet,只有在涉及至少两个来源(供应商)并且它们必须至少供应巧克力时才会产生。这将分别为每个供应商完成(请假设我已经根据输入数据定义了变量):

if (suppliesChoc > 0 and suppliesCereal > 0 and numSources > 1) or (suppliesChoc > 1) then
  then suppliesSweet = "Yes"
else suppliesSweet = "No"
end

还不是问题。

问题在于我尝试跨供应商聚合这些结果时。(就像我之前在 ukOnly 中做的那样)。

我已经在使用以下功能:

table.contains = function(t, value) -- 查找 "value" 是否存在于表 "t" 中
    for index = 1, #t do
        if t[index] == value then
            return index
        end
    end
end

并且考虑创建以下内容:

table.overlap = function(t,g) -- 查找表 "g" 和表 "t" 是否有任何重叠的值
    for i=1,#t do
        if table.contains(g,t[i]) then
           return true
        else
           return false
        end
    end
end

但我不确定该从哪里开始。

您可以假设我已经为每个供应商获得了唯一源列表,并且我不介意过度严格。也就是说,如果两个供应商之间的任何来源重叠,都会使整个结果无效。

您还可以假设我已经将每个供应商的“事实”:suppliesChocsuppliesCerealnumSourcessuppliesSweet 分别返回。

点赞
用户7396148
用户7396148

我认为你在寻找两个集合的交集。

https://en.wikipedia.org/wiki/Intersection_(set_theory)

其中一个集合是你供应商的供应商,另一个是提供甜食的供应商。

local vendors = {
  Asda = {Kellogg = true, Cadbury = true, Nestle = true, Johnsons = true, Pampers = true, Simple = true},
  Tesco = {Kellogg = true, Cadbury = true, Nestle = true, Johnsons = true},
  Spar ={Nestle = true, Johnsons = true, Pampers = true, Simple = true}
}

function intersection(s1, s2)
  local output = {}

  for key in pairs(s1) do
    output[#output + 1] = s2[key]
  end

  return output
end

local sweetSuppliers = {Kellogg = true, Cadbury = true, Nestle = true}

for name, suppliers in pairs(vendors) do
  local result = intersection(sweetSuppliers, suppliers)

  print(name .. " has " .. #result .. " sweets suppliers")
end

以下是用于处理集合的库的示例:

odkr's properset.lua

Windower's sets.lua

两者都可以让你了解如何使用集合来完成交集等任务,以及更多其他事情。

2019-09-05 18:33:27