109 lines
2.2 KiB
Plaintext
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 |