Newer
Older
TheVengeance-Project-IADE-Unity2D / Assets / Scripts / DataStructures / Hashtables / HashTable.cs
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class HashTableNode
  5. {
  6. public string Key
  7. {
  8. set;
  9. get;
  10. }
  11. public object Value
  12. {
  13. set;
  14. get;
  15. }
  16. public HashTableNode Next
  17. {
  18. set;
  19. get;
  20. }
  21. public HashTableNode(string key, object value)
  22. {
  23. Key = key;
  24. Value = value;
  25. Next = null;
  26. }
  27. }
  28. public class HashTable
  29. {
  30. private HashTableNode[] buckets;
  31. private int tableSize;
  32. public HashTable(int size)
  33. {
  34. buckets = new HashTableNode[size];
  35. tableSize = size;
  36. }
  37. private int HashFunction(string key)
  38. {
  39. long index = 7;
  40. int asciiCode = 0;
  41. for (int i = 0; i < key.Length; i++)
  42. {
  43. asciiCode = (int)key[i] * i;
  44. index = index * 31 + asciiCode;
  45. }
  46. return (int)(index % tableSize);
  47. }
  48. public void Insert(string key, object value)
  49. {
  50. int hashIndex = HashFunction(key);
  51. HashTableNode node = buckets[hashIndex];
  52. if (node == null)
  53. {
  54. buckets[hashIndex] = new HashTableNode(key, value);
  55. }
  56. else
  57. {
  58. if (node.Key == key)
  59. {
  60. node.Value = value;
  61. }
  62. else
  63. {
  64. while (node.Next != null)
  65. {
  66. node = node.Next;
  67. if (node.Key == key)
  68. {
  69. node.Value = value;
  70. return;
  71. }
  72. }
  73. HashTableNode newNode = new HashTableNode(key, value);
  74. node.Next = newNode;
  75. }
  76. }
  77. }
  78. public object GetValue(string key)
  79. {
  80. int hashIndex = HashFunction(key);
  81. HashTableNode node = buckets[hashIndex];
  82. while (node != null)
  83. {
  84. if (node.Key == key)
  85. {
  86. return node.Value;
  87. }
  88. node = node.Next;
  89. }
  90. return null;
  91. }
  92. public bool Remove(string key)
  93. {
  94. int hashIndex = HashFunction(key);
  95. HashTableNode node = buckets[hashIndex];
  96. if (node == null)
  97. {
  98. return false;
  99. }
  100. if (node.Key == key)
  101. {
  102. buckets[hashIndex] = node.Next;
  103. return true;
  104. }
  105. HashTableNode previous = node;
  106. while (node != null)
  107. {
  108. if (node.Key == key)
  109. {
  110. previous.Next = node.Next;
  111. return true;
  112. }
  113. previous = node;
  114. node = node.Next;
  115. }
  116. return false;
  117. }
  118. public bool ContainsKey(string key)
  119. {
  120. int hashIndex = HashFunction(key);
  121. HashTableNode node = buckets[hashIndex];
  122. if (node == null)
  123. {
  124. return false;
  125. }
  126. else
  127. {
  128. if (node.Key == key)
  129. {
  130. return true;
  131. }
  132. else
  133. {
  134. while (node.Next != null)
  135. {
  136. node = node.Next;
  137. if (node.Key == key)
  138. {
  139. return true;
  140. }
  141. }
  142. return false;
  143. }
  144. }
  145. }
  146. public bool ContainsValue(object value)
  147. {
  148. for (int i = 0; i < tableSize; i++)
  149. {
  150. HashTableNode node = buckets[i];
  151. if (node != null)
  152. {
  153. if (node.Value == value)
  154. {
  155. return true;
  156. }
  157. while (node.Next != null)
  158. {
  159. node = node.Next;
  160. if (node.Value == value)
  161. {
  162. return true;
  163. }
  164. }
  165. }
  166. }
  167. return false;
  168. }
  169. public int Count()
  170. {
  171. int count = 0;
  172. for (int i = 0; i < tableSize; i++)
  173. {
  174. HashTableNode node = buckets[i];
  175. if (node != null)
  176. {
  177. count++;
  178. while (node.Next != null)
  179. {
  180. node = node.Next;
  181. count++;
  182. }
  183. }
  184. }
  185. return count;
  186. }
  187. }