2025-06-04 05:02:57 +08:00

109 lines
2.2 KiB
Plaintext

ArrayUtil = {}
local reusableArray1 = {}
local reusableArray2 = {}
local reuse_hashtable = {}
local TableClear = TableUtility.TableClear
local ArrayClear = TableUtility.ArrayClear
local insert = table.insert
function ArrayUtil.Intersection(arr1, arr2)
TableClear(reuse_hashtable)
ArrayClear(reusableArray1)
for i = 1, #arr1 do
reuse_hashtable[arr1[i]] = 0
end
for i = 1, #arr2 do
local item = arr2[i]
if reuse_hashtable[item] then
insert(reusableArray1, item)
end
end
return reusableArray1
end
function ArrayUtil.Complementary(arr1, arr2)
TableClear(reuse_hashtable)
ArrayClear(reusableArray1)
for i = 1, #arr2 do
reuse_hashtable[arr2[i]] = 0
end
for i = 1, #arr1 do
local item = arr1[i]
if not reuse_hashtable[item] then
table.insert(reusableArray1, item)
end
end
return reusableArray1
end
function ArrayUtil.NumberArrayIntersection(arr1, arr2)
ArrayUtil.NumberArraySort(arr1)
ArrayUtil.NumberArraySort(arr2)
TableUtility.ArrayClear(reusableArray1)
local i, j = 1, 1
while i <= #arr1 and j <= #arr2 do
if arr1[i] == arr2[j] then
table.insert(reusableArray1, arr1[i])
i = i + 1
j = j + 1
elseif arr1[i] > arr2[j] then
j = j + 1
elseif arr1[i] < arr2[j] then
i = i + 1
end
end
return reusableArray1
end
function ArrayUtil.NumberArraySort(arr)
table.sort(arr)
end
function ArrayUtil.NumberArrayQuickSort(arr)
for i = 2, #arr do
if arr[i] < arr[i - 1] then
local j = i - 1
local temp = arr[i]
arr[i] = arr[i - 1]
while j > 0 and temp < arr[j] do
arr[j + 1] = arr[j]
j = j - 1
end
arr[j + 1] = temp
end
end
end
function ArrayUtil.NumberArrayComplementary(arr1, arr2)
ArrayUtil.NumberArraySort(arr1)
ArrayUtil.NumberArraySort(arr2)
TableUtility.ArrayClear(reusableArray1)
for i = 1, #arr1 do
table.insert(reusableArray1, arr1[i])
end
local i, j = #arr1, #arr2
while i >= 1 and j >= 1 do
if arr1[i] == arr2[j] then
table.remove(reusableArray1, i)
i = i - 1
j = j - 1
elseif arr1[i] < arr2[j] then
j = j - 1
elseif arr1[i] > arr2[j] then
i = i - 1
end
end
return reusableArray1
end
function ArrayUtil.ArraySet(arr1, arr2)
if arr2 ~= nil then
TableUtility.ArrayClear(arr1)
for i = 1, #arr2 do
table.insert(arr1, arr2[i])
end
else
arr1 = arr2
end
end