示例#1
0
        public void Add(TKey key, TValue value)
        {
            int pos = GetPosition(key, items.Length);

            if (items[pos] == null)
            {
                items[pos] = new ZLinkedList <Tuple <TKey, TValue> >();
            }

            ZLinkedListNode <Tuple <TKey, TValue> > current = items[pos].Head;

            while (current != null)
            {
                if (current.Value.Item1.Equals(key))
                {
                    throw new Exception("Duplicate key, cannot insert.");
                }
                current = current.NextNode;
            }

            size++;
            if (NeedToGrow())
            {
                GrowAndRehash();
            }

            pos = GetPosition(key, items.Length);

            if (items[pos] == null)
            {
                items[pos] = new ZLinkedList <Tuple <TKey, TValue> >();
            }

            items[pos].Add(new Tuple <TKey, TValue>(key, value));
        }
示例#2
0
        public ZLinkedList <T> MergeSortedLinkedList(ZLinkedList <T> linkedList)
        {
            ZLinkedList <T> newList = new ZLinkedList <T>();

            ZLinkedListNode <T> node1 = this.Head;
            ZLinkedListNode <T> node2 = linkedList.Head;

            while (node1 != null || node2 != null)
            {
                if ((node1 != null && node1.Value.CompareTo(node2.Value) >= 1) || node2 == null)
                {
                    newList.Add(node1.Value);

                    if (node1 != null && node1.NextNode != null)
                    {
                        node1 = node1.NextNode;
                    }
                }
                else
                {
                    newList.Add(node2.Value);

                    if (node2 != null && node2.NextNode != null)
                    {
                        node2 = node2.NextNode;
                    }
                }
            }

            return(newList);
        }
示例#3
0
        private void GrowAndRehash()
        {
            fillFactor *= 2;

            ZLinkedList <Tuple <TKey, TValue> >[] newItems = new ZLinkedList <Tuple <TKey, TValue> > [items.Length * 2];
            foreach (var item in items.Where(x => x != null))
            {
                ZLinkedListNode <Tuple <TKey, TValue> > current = item.Head;
                while (current != null)
                {
                    var pos = GetPosition(current.Value.Item1, newItems.Length);
                    if (newItems[pos] == null)
                    {
                        newItems[pos] = new ZLinkedList <Tuple <TKey, TValue> >();
                    }
                    newItems[pos].Add(new Tuple <TKey, TValue>(current.Value.Item1, current.Value.Item2));
                    current = current.NextNode;
                }
            }
            items = newItems;
        }