/// <summary> /// insert key and value into hashtable /// if the key already in the hashtable, change the value /// </summary> /// <param name="key"></param> /// <param name="val"></param> public void Insert(K key, V val) { SingleListNode <K, V> results = search(key); if (results != null) { results.Value = val; return; } SingleListNode <K, V> node = new SingleListNode <K, V>(key, val); node.Next = arrs[GetPosition(key)]; arrs[GetPosition(key)] = node; count++; if (count / arrs.Length >= 10) { SingleListNode <K, V>[] tmp = arrs; arrs = new SingleListNode <K, V> [count]; count = 0; for (int i = 0; i < tmp.Length; i++) { SingleListNode <K, V> sln = tmp[i]; while (sln != null) { Insert(sln.Key, sln.Value); sln = sln.Next; } } } }
/// <summary> /// search the key from table /// If not found, return null /// </summary> /// <param name="key"></param> /// <returns></returns> private SingleListNode <K, V> search(K key) { int position = GetPosition(key); SingleListNode <K, V> results = arrs[position]; while (results != null && !results.Key.Equals(key)) { results = results.Next; } return(results); }
public void Insert(T item) { SingleListNode <T> node = new SingleListNode <T>(item); Count++; if (head == null || tail == null) { head = tail = node; } else { tail.Next = node; } }
/// <summary> /// search /// </summary> /// <param name="item"></param> /// <returns></returns> public SingleListNode <T> Search(T item) { SingleListNode <T> node = head; while (node != null) { if (node.Key.CompareTo(item) == 0) { return(node); } else { node = node.Next; } } return(null); }
/// <summary> /// delete key in hashtable, if not contains , throw exception /// </summary> /// <param name="key"></param> /// <returns></returns> public V Delete(K key) { if (!Contains(key)) { throw new Exception("can not find key"); } int position = GetPosition(key); SingleListNode <K, V> results = arrs[position]; if (results.Key.Equals(key)) { arrs[position] = results.Next; } else { SingleListNode <K, V> before = arrs[position]; while (results != null && !results.Key.Equals(key)) { before = results; results = results.Next; } before.Next = results.Next; } count--; if (count >= 4 && arrs.Length / count > 8) { SingleListNode <K, V>[] tmp = arrs; arrs = new SingleListNode <K, V> [count]; count = 0; for (int i = 0; i < tmp.Length; i++) { SingleListNode <K, V> sln = tmp[i]; while (sln != null) { Insert(sln.Key, sln.Value); sln = sln.Next; } } } return(results.Value); }
/// <summary> /// delete the first item meet in list /// </summary> /// <param name="item"></param> public void Delete(T item) { if (IsEmpty) { return; } SingleListNode <T> node = head; while (node != null) { if (node.Key.CompareTo(item) == 0) { //this node is head if (tail == head) { tail = null; } head = head.Next; Count--; return; } else if (node.Next != null && node.Next.Key.CompareTo(item) == 0) { Count--; if (tail == node.Next) { tail = node; node.Next = null; } else { node.Next = node.Next.Next; } return; } else { node = node.Next; } } }
/// <summary> /// whether the Hashtable contains the key /// </summary> /// <param name="key"></param> /// <returns></returns> public bool Contains(K key) { SingleListNode <K, V> results = search(key); return(results != null); }
/// <summary> /// search the key from table /// If not found, return null /// </summary> /// <param name="key"></param> /// <returns></returns> public V Search(K key) { SingleListNode <K, V> results = search(key); return(results == null ? null : results.Value); }