Thread: Table Sorting
View Single Post
02-01-15, 05:18 PM   #24
Banknorris
A Chromatic Dragonspawn
 
Banknorris's Avatar
AddOn Author - Click to view addons
Join Date: Oct 2014
Posts: 153
On the main subject:
If you want a way to access the indexes in order and you also need to add and remove indexes without losing the order then the best way is to implement a binary search tree with the key values. In a binary search tree you can add and remove elements without having the sort the table every time. I have a simple implementation with an example in this thread:
http://us.battle.net/wow/en/forum/topic/11986218743#7
My example only deal with strings but it is possible to generalize it by passing a function that is able to determine the order between indexes (like comparing a number to a string and returning 1,0,-1 depending if the first argument should be considered greater, equal or lower than the second).

Lua Code:
  1. --insert value in the binary tree
  2. function BinarySearchTree.insert(tree_node,value,compare_values)
  3.     if tree_node==nil then
  4.         tree_node = {}
  5.         tree_node.value = value
  6.         tree_node.n = 1
  7.     elseif compare_value(tree_node.value,value)>0 then
  8.         tree_node.left = BinarySearchTree.insert(tree_node.left,value,compare_values)
  9.         tree_node.n = tree_node.n+1
  10.     elseif compare_value(tree_node.value,value)<0 then
  11.         tree_node.right = BinarySearchTree.insert(tree_node.right,value,compare_values)
  12.     end
  13.     return tree_node
  14. end
  15.  
  16. --remove value from a binary tree
  17. function BinarySearchTree.delete(tree_node,value,compare_values)
  18.     if tree_node then
  19.         if compare_value(tree_node.value,value)>0 then
  20.             tree_node.left = BinarySearchTree.delete(tree_node.left,value,compare_values)
  21.             tree_node.n = tree_node.n-1
  22.         elseif compare_values(tree_node.value,value)<0 then
  23.             tree_node.right = BinarySearchTree.delete(tree_node.right,value,compare_values)
  24.         elseif tree_node.left==nil and tree_node.right==nil then
  25.             tree_node = nil
  26.         elseif tree_node.left==nil and tree_node.right then
  27.             tree_node = tree_node.right
  28.         elseif tree_node.left and tree_node.right==nil then
  29.             tree_node = tree_node.left
  30.         else
  31.             tree_node.value = BinarySearchTree.get_min_value(tree_node.right)
  32.             tree_node.right = BinarySearchTree.delete(tree_node.right,tree_node.value,compare_values)
  33.         end
  34.     end
  35.     return tree_node
  36. end
  37.  
  38. --get i-th element of the tree, m is just used on the recursion calls
  39. function BinarySearchTree.get_element_i(tree_node,i,m)
  40.     m = m or 0
  41.     if tree_node==nil then
  42.         return nil
  43.     elseif tree_node.n+m==i then
  44.         return tree_node.value
  45.     elseif tree_node.n+m>i then
  46.         return BinarySearchTree.Get_element_n(tree_node.left,i,m)
  47.     else
  48.         return BinarySearchTree.Get_element_n(tree_node.right,i,m+tree_node.n)
  49.     end
  50. end
  51.  
  52. function BinarySearchTree.get_min_value(tree_node)
  53.     if tree_node.left==nil then
  54.         return tree_node.value
  55.     else
  56.         return BinarySearchTree.get_min_value(tree_node.left)
  57.     end
  58. end
  59.  
  60. function BinarySearchTree.max_value(tree_node)
  61.     if tree_node.right==nil then
  62.         return tree_node.value
  63.     else
  64.         return BinarySearchTree.get_max_value(tree_node.right)
  65.     end
  66. end
  Reply With Quote