Lua: 以不区分大小写的方式合并两个字符串集合

我希望以不区分大小写的方式合并两个字符串集合:

string_collection1 = {"hello","buddy","world","ciao"}
string_collection2 = {"Hello","Buddy","holly","Bye", "bYe"}
merged_string_collection = merge_case_insensitive(string_collection1,string_collection2) --> {"hello","buddy","world","holly","bye","ciao"}

以下是一个尝试,但它无法正常工作...

function merge_case_insensitive(t1,t2)
    t3 = {}
    for _,s1 in pairs(t1) do
        for _,s2 in pairs(t2) do
            if string.lower(s1) == string.lower(s2) then
                t3[s1] = s1
            end
        end
    end
    t4 = {}
    i = 1
    for s,_ in pairs(t3) do
        t4[i] = string.lower(s)
        i = i + 1
    end
    return t4
end

string_collection1 = {"hello","buddy","world","ciao"}
string_collection2 = {"Hello","Buddy","holly","Bye", "bYe"}
merged_string_collection = merge_case_insensitive(string_collection1,string_collection2)

for k,v in pairs(merged_string_collection) do print(k,v) end
点赞
用户2858170
用户2858170

它不能工作,因为您使用==来比较两个字符串,其中进行了区分大小写。

您可以做一些像string.lower(s1) == string.lower(s2)这样的事情来解决这个问题。

编辑:

由于您不能自行找到剩余部分,因此提供一些代码:

local t1 = {"hello","buddy","world","ciao"}
local t2 = {"Hello","Buddy","holly","Bye", "bYe"}

local aux_table = {}
local merged_table = {}

for k,v in pairs(t1) do
  aux_table[v:lower()] = true
end

for k,v in pairs(t2) do
  aux_table[v:lower()] = true
end

for k,v in pairs(aux_table) do
  table.insert(merged_table, k)
end

现在,merged_table 包含输入表中每个单词的小写版本。

现在请将其倒入可以接受任意数量的输入表格的函数中,您就完成了。

我们在此执行的操作:我们使用这些表中每个单词的小写版本并将它们存储在列表中。aux_table[string.lower("Hello")]将索引与aux_table[string.lower("hello")]相同的值。因此,即使单词以多个变体出现,我们也会得到一个条目。使用键可避免我们比较字符串并区分唯一单词和其他单词。

2016-10-19 19:16:00
用户3735873
用户3735873

为了得到一个表格,其中包含出现一次的两个其他表格中的所有字符串(不区分大小写),你需要像这样:

function merge_case_insensitive(t1,t2)
  local ans = {}
  for _,v in pairs(t1) do ans[v:lower()] = true end
  for _,v in pairs(t2) do ans[v:lower()] = true end
  return ans
end

string_collection1 = {"hello","buddy","world","ciao"}
string_collection2 = {"Hello","Buddy","holly","Bye", "bYe"}
merged_string_collection = merge_case_insensitive(string_collection1,string_collection2)

for k in pairs(merged_string_collection) do print(k) end

编辑:如果你想要一个数组结果(不添加另一个迭代)

function merge_case_insensitive(t1,t2)
  local ans = {}
  local
  function add(t)
    for _,v in pairs(t) do
      v = v:lower()
      if ans[v] == nil then ans[#ans+1] = v end
      ans[v] = true
    end
  end
  add(t1)
  add(t2)
  return ans
end

string_collection1 = {"hello","buddy","world","ciao"}
string_collection2 = {"Hello","Buddy","holly","Bye", "bYe"}
merged_string_collection = merge_case_insensitive(string_collection1,string_collection2)

for _,v in ipairs(merged_string_collection) do print(v) end
2016-10-19 21:46:09
用户3979429
用户3979429

我们可以通过简单地迭代两个表来完成此操作,并存储一个临时字典以检查我们已经找到了什么单词,如果尚未找到,则将它们放入我们的新数组中:

function Merge(t1, t2)
    local found = {} -- 临时字典
    local new = {} -- 新数组
    local low -- 用于以后存储单词的低版本值
    for i,v in ipairs(t1) do -- 开始迭代第一个表
        low = v:lower()
        if not found[low] then -- 如果没有找到
            new[#new+1] = low -- 将其放入新表中
            found[low] = true -- 添加到找到的
        end
    end
    for i,v in ipairs(t2) do -- 重复第二个表
        low = v:lower()
        if not found[low] then
            new[#new+1] = low
            found[low] = true
        end
    end
    return new -- 返回新数组
end

这种方法消除了像Piglet的答案中需要第三次迭代的需要,并且不会像tonypdmtr的答案中一样不停地重新定义函数和闭包并调用它们。

2016-10-20 02:40:19