- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class HashTableNode
- {
- public string Key
- {
- set;
- get;
- }
- public object Value
- {
- set;
- get;
- }
- public HashTableNode Next
- {
- set;
- get;
- }
- public HashTableNode(string key, object value)
- {
- Key = key;
- Value = value;
- Next = null;
- }
- }
- public class HashTable
- {
- private HashTableNode[] buckets;
- private int tableSize;
- public HashTable(int size)
- {
- buckets = new HashTableNode[size];
- tableSize = size;
- }
- private int HashFunction(string key)
- {
- long index = 7;
- int asciiCode = 0;
- for (int i = 0; i < key.Length; i++)
- {
- asciiCode = (int)key[i] * i;
- index = index * 31 + asciiCode;
- }
- return (int)(index % tableSize);
- }
- public void Insert(string key, object value)
- {
- int hashIndex = HashFunction(key);
- HashTableNode node = buckets[hashIndex];
- if (node == null)
- {
- buckets[hashIndex] = new HashTableNode(key, value);
- }
- else
- {
- if (node.Key == key)
- {
- node.Value = value;
- }
- else
- {
- while (node.Next != null)
- {
- node = node.Next;
- if (node.Key == key)
- {
- node.Value = value;
- return;
- }
- }
- HashTableNode newNode = new HashTableNode(key, value);
- node.Next = newNode;
- }
- }
- }
- public object GetValue(string key)
- {
- int hashIndex = HashFunction(key);
- HashTableNode node = buckets[hashIndex];
- while (node != null)
- {
- if (node.Key == key)
- {
- return node.Value;
- }
- node = node.Next;
- }
- return null;
- }
- public bool Remove(string key)
- {
- int hashIndex = HashFunction(key);
- HashTableNode node = buckets[hashIndex];
- if (node == null)
- {
- return false;
- }
- if (node.Key == key)
- {
- buckets[hashIndex] = node.Next;
- return true;
- }
- HashTableNode previous = node;
- while (node != null)
- {
- if (node.Key == key)
- {
- previous.Next = node.Next;
- return true;
- }
- previous = node;
- node = node.Next;
- }
- return false;
- }
- public bool ContainsKey(string key)
- {
- int hashIndex = HashFunction(key);
- HashTableNode node = buckets[hashIndex];
- if (node == null)
- {
- return false;
- }
- else
- {
- if (node.Key == key)
- {
- return true;
- }
- else
- {
- while (node.Next != null)
- {
- node = node.Next;
- if (node.Key == key)
- {
- return true;
- }
- }
- return false;
- }
- }
- }
- public bool ContainsValue(object value)
- {
- for (int i = 0; i < tableSize; i++)
- {
- HashTableNode node = buckets[i];
- if (node != null)
- {
- if (node.Value == value)
- {
- return true;
- }
- while (node.Next != null)
- {
- node = node.Next;
- if (node.Value == value)
- {
- return true;
- }
- }
- }
- }
- return false;
- }
- public int Count()
- {
- int count = 0;
- for (int i = 0; i < tableSize; i++)
- {
- HashTableNode node = buckets[i];
- if (node != null)
- {
- count++;
- while (node.Next != null)
- {
- node = node.Next;
- count++;
- }
- }
- }
- return count;
- }
- }