Advertisement
code_gs

Array comparison test

Nov 4th, 2020
2,006
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.19 KB | None | 0 0
  1. function Array.HasValue(tbl, val)
  2.     for i = 1, #tbl do
  3.         if tbl[i] == val then
  4.             return true
  5.         end
  6.     end
  7.  
  8.     return false
  9. end
  10.  
  11. function Array.Compare(tOrig, tNew)
  12.     local tAdded, uAddedLen = {}, 0
  13.     local tLost uLostLen = {}, 0
  14.  
  15.     local uOrigLen = #tOrig
  16.     local uNewLen = #tNew
  17.  
  18.     if (uOrigLen <= uNewLen) then
  19.         -- Do added and lost comparisons in one loop for the length of the original table
  20.         for i1 = 1, uOrigLen do
  21.             local val = tOrig[i1]
  22.            
  23.             for i2 = 1, uNewLen do
  24.                 if (val == tNew[i2]) then
  25.                     goto NoLoss11
  26.                 end
  27.             end
  28.            
  29.             uLostLen = uLostLen + 1
  30.             tLost[uLostLen] = val
  31.            
  32.             ::NoLoss11::
  33.            
  34.             val = tNew[i1]
  35.            
  36.             for i2 = 1, uOrigLen do
  37.                 if (val == tOrig[i2]) then
  38.                     goto NoAdded11
  39.                 end
  40.             end
  41.            
  42.             uAddedLen = uAddedLen + 1
  43.             tAdded[uAddedLen] = val
  44.            
  45.             ::NoAdded11::
  46.         end
  47.        
  48.         -- Only do the second loop if there's still more to check
  49.         if (uAddedLen ~= uOrigLen) then
  50.             -- Check the rest of the second table now for any additional adds
  51.             for i1 = uOrigLen + 1, uNewLen do
  52.                 local val = tNew[i1]
  53.                
  54.                 for i2 = 1, uOrigLen do
  55.                     if (val == tOrig[i2]) then
  56.                         goto NoAdded12
  57.                     end
  58.                 end
  59.                
  60.                 uAddedLen = uAddedLen + 1
  61.                 tAdded[uAddedLen] = val
  62.                
  63.                 ::NoAdded12::
  64.             end
  65.         end
  66.     else
  67.         -- Since the new table has less elements, the second loop will be a loss check instead of an add check
  68.         for i1 = 1, uNewLen do
  69.             local val = tNew[i1]
  70.            
  71.             for i2 = 1, uOrigLen do
  72.                 if (val == tOrig[i2]) then
  73.                     goto NoAdded21
  74.                 end
  75.             end
  76.            
  77.             uAddedLen = uAddedLen + 1
  78.             tAdded[uAddedLen] = val
  79.            
  80.             ::NoAdded21::
  81.            
  82.             val = tOrig[i1]
  83.            
  84.             for i2 = 1, uNewLen do
  85.                 if (val == tNew[i2]) then
  86.                     goto NoLoss21
  87.                 end
  88.             end
  89.            
  90.             uLostLen = uLostLen + 1
  91.             tLost[uLostLen] = val
  92.            
  93.             ::NoLoss21::
  94.         end
  95.        
  96.         if (uLostLen ~= uNewLen) then
  97.             for i1 = uNewLen + 1, uOrigLen do
  98.                 local val = tOrig[i1]
  99.                
  100.                 for i2 = 1, uNewLen do
  101.                     if (val == tNew[i2]) then
  102.                         goto NoLoss22
  103.                     end
  104.                 end
  105.                
  106.                 uLostLen = uLostLen + 1
  107.                 tLost[uLostLen] = val
  108.                
  109.                 ::NoLoss22::
  110.             end
  111.         end
  112.     end
  113.  
  114.     return tAdded, uAddedLen, tLost, uLostLen
  115. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement