从值的数组中删除成对的重复项

问题

lua中,我有一组值的数组(具体来说是xy位置值),我想要删除其中的重复_pairs_。数组如下所示:

array = {x1,y1,x2,y2,x3,y3,...,xn,yn} 

其中n是协调对数。因此,一个值是x坐标还是y坐标,仅由其在数组中的位置确定。重复定义为xa == xbya == yb。因此,例如,如果x1 == x2y1 == y2,则我想要从数组中删除x1y1or(不是两者)x2y2

问题

1.如何从这样的数组中删除重复项? 2.是否可以不对数组进行细分而完成? 3. _奖励:_在更常见的情况下,如果数组包含3个(甚至更多)变量,即array = {x1,y1,z1,x2,y2,z2,...,xn,yn,zn}

数字例子

如果给出值的数组:

array = {11211121} 

然后删除重复项应该导致一个数组:

array = {1121} 
点赞
用户577603
用户577603

你可以使用一个表的表来跟踪重复的元素。外部表按 x 分量索引,内部表按 y 分量索引。然后,只需使用增量为 2 迭代原始数组,如果元素没有被跟踪为重复的,则只需要将它们复制到结果中。

2017-03-20 16:39:50
用户7504558
用户7504558

如果对于一对的顺序不重要,那么可以这样做:

local Coords = {1, 1, 2, 1, 1, 1, 2, 1}
local Result, interim = {}, {}

for i=1,#Coords,2 do
      if Coords[i+1]  then
           local PointSignature = Coords[i] .. '_' .. Coords[i+1]
           interim[PointSignature] = true
      end
end
for k,v in pairs(interim) do
     local x, y = k:match("(.+)_(.+)")
     Result[#Result+1] = x
     Result[#Result+1] = y
end
for i=1, #Result do
  print(Result[i])
end

结果略微有序。

另一版本,结果按原始顺序:

local Coords = {1, 1, 22, 1, 1, 1, 2, 1, 11, 11, 22, 1}
local Result, interim = {}, {}

for i=1,#Coords,2 do
      if Coords[i+1]  then
           local PointSignature = Coords[i] .. '_' .. Coords[i+1]
           if not interim[PointSignature] then
                 Result[#Result+1] = Coords[i]
                 Result[#Result+1] = Coords[i+1]
                 interim[PointSignature] = true
           end
      end
end
2017-03-20 17:18:59
用户3735873
用户3735873

这个函数还能处理关于能够处理任何大小的分组变量的第三个点。你所需要做的就是给出你想假定的分组大小(默认为2)。

function remove_dups(t,size)
  size = size or 2            --默认分组大小为2
  assert(#t % size == 0,'Table size is not a multiple of "size"')
  local temp = {}
  local key
  local i = 1
  while i <= #t do
    key = t[i]
    for count = 1, size-1 do
      key = key .. '|' .. t[i+count]
    end
    if temp[key] then
      for count = 1, size do
        table.remove(t,i)
      end
    else
      temp[key] = true
      i = i + size
    end
  end
  return t
end

-- 测试上面的代码 --

function pa(t,size) -- 按大小分组打印数组
  size = size or 2
  for i,v in ipairs(t) do io.write(v,i ~= #t and i % size == 0 and ', ' or ' ') end
  print()
end

array = {1, 1, 2, 1, 2, 1, 2, 1, 3, 2, 2, 1, 1, 1, 1, 1, 3, 2, 1, 1}

print '原始'
pa(array)

print '去除重复'
pa(remove_dups(array))
2017-03-20 21:30:16
用户12968803
用户12968803
数组可以转换成地图,再转回到列表:

local map = {}
for i = 1, #array-1, 2 do
    local x, y = array[i], array[i+1]
    -- 如果 x 坐标没有被添加过,则在地图上创建一个新的点
    if not map[x] then map[x] = {} end
    map[x][y] = true
end

local uniqueList = {}
for x, ys in pairs (map) do
    for y, b in pairs (ys) do
        table.insert(uniqueList, x)
        table.insert(uniqueList, y)
    end
end

其中 array = {x1, y1, x2, y2, x3, y3, ... , xn, yn} 表示一个由 x, y 坐标组成的数组。上述代码将数组转换成一个二维地图,并从地图中取出每个点的 x 和 y 坐标,在 uniqueList 中按照顺序插入。

2022-05-01 09:54:28