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

时间:2016-10-19 18:40:25

标签: lua

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

         grp mean_size  sd_size  rows
       <chr>     <dbl>    <dbl> <chr>
1 last_group   42330.5 16866.59 11:18
2     others   23597.9 13521.32  1:10

这是一次尝试,但它不起作用......

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"}

3 个答案:

答案 0 :(得分:1)

它不起作用,因为您使用==来比较两个区分大小写的字符串。

您可以执行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")]相同的值编入索引。因此,即使一个单词有多个变体,我们最终会为每个单词输入一个条目。 使用这些键为我们节省了比较字符串和在独特单词和其他单词之间进行分类的麻烦。

答案 1 :(得分:1)

要获得一个包含来自其他两个表的所有字符串的表(不考虑大小写),您需要这样的内容:

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

答案 2 :(得分:1)

我们可以通过简单地迭代两个表,并存储一个临时字典来检查我们已经找到的单词,如果还没有,将它们放入我们的新数组中,我们可以做到这一点:

function Merge(t1, t2)
    local found = {} --Temporary dictionary
    local new = {} --New array
    local low --Value to store low versions of words in later
    for i,v in ipairs(t1) do --Begin iterating over table one
        low = v:lower()
        if not found[low] then --If not found yet
            new[#new+1] = low --Put it in the new table
            found[low] = true --Add it to found
        end
    end
    for i,v in ipairs(t2) do --Repeat with table 2
        low = v:lower()
        if not found[low] then
            new[#new+1] = low
            found[low] = true
        end
    end
    return new --Return the new array
end

这种方法不需要第三次迭代,就像Piglet的回答一样,并且不会重新定义一个函数和闭包,并像在tonypdmtr的答案中那样调用它们。