Esempio n. 1
0
def test_remove():
    hm = HashMap()
    keys = [(r, r) for r in (range(10))]
    values = list(range(1, 11))
    for k, v in zip(keys, values):
        hm.set(k, v)
    hm.remove((3, 3))
    print(hm)
    with pytest.raises(KeyError):
        hm.get((3, 3))
    assert hm.get((5, 5)) == 6
    def test_put_remove(self):
        hash_map = HashMap()
        size = 20
        for key in range(1, size + 1):
            value = key * 2
            hash_map.put(key, value)
        
        self.assertEqual(hash_map.size(), size)

        for key in range(1, size + 1):            
            hash_map.remove(key)

        self.assertEqual(hash_map.size(), 0)
Esempio n. 3
0
    def test_combo_add_remove(self):
        hash_map = HashMap()
        hash_map["abc"] = True
        hash_map["moo"] = False
        hash_map["goo"] = True
        hash_map["foo"] = False

        assert len(hash_map) == 4

        hash_map.remove("goo")
        hash_map.remove("abc")

        assert len(hash_map) == 2

        hash_map["goo"] = False

        assert len(hash_map) == 3
Esempio n. 4
0
def find_pairs(array):
    if len(array) < 2:
        return []
    else:
        output = []
        zero_count = 0
        for item in array:
            if item == 0:
                zero_count += 1
        if zero_count > 1:
            output.append((0, 0))
        mymap = HashMap()
        for item in array:
            mymap.put(-item, item)

        for item in array:
            if mymap.contains_key(item):
                if item != 0:
                    output.append((item, -item))
                    mymap.remove(item)
                    mymap.remove(-item)
        return output
Esempio n. 5
0
    def test_remove(self):
        HM = HashMap()

        # Removing value from hashmap
        self.assertTrue(HM.put(6, "six"))
        self.assertTrue(HM.remove(6))

        # Removing values with colliding hash value
        self.assertTrue(HM.put(3, "three"))
        self.assertTrue(HM.put(25, "twenty-five"))
        self.assertTrue(HM.put(36, "thirty-six"))
        self.assertTrue(HM.put(47, "forty-seven"))
        self.assertTrue(HM.remove(3))
        self.assertTrue(HM.remove(25))
        self.assertTrue(HM.remove(36))
        self.assertFalse(HM.has(36))
        self.assertFalse(HM.has(25))
        self.assertTrue(HM.has(47))

        # Testing again
        self.assertTrue(HM.put(25, "twenty-five"))
        self.assertTrue(HM.has(25))

        self.assertTrue(HM.remove(47))
Esempio n. 6
0
    print( 'inserting ', keys[ i] , '/', values[ i]  )
    myMap.add( keys[ i ], values[ i ] )    # (key, value) pair

# Test the iterator
print( 'original map : ' )
for v in myMap:
    print( '[', v.key, '/', v.value, ']', end = ' ' )
print()

# Test search
print( 'value of key 6 should be 0, it is ', myMap.valueOf( 6 ) )
print( 'value of key 56 should be 9, it is ', myMap.valueOf( 56 ) )
print( 'value of key 12 should be 4, it is ', myMap.valueOf( 12 ) )

# Test removal
myMap.remove( 100 )
myMap.remove( 56 )

print( 'map after removing keys "100", "56" : ' )
for v in myMap:
    print( '[', v.key, '/', v.value, ']', end = ' ' )
print()

print( 'value of key 6 should be 0, it is ', myMap.valueOf( 6 ) )
print( 'value of key 12 should be 4, it is ', myMap.valueOf( 12 ) )
print( 'value of key 56 should be "not found", it is ', myMap.valueOf( 56 ) )

# Print stats
myMap.printStats()

# Now a large set of random data to test collisions
Esempio n. 7
0
    def test_remove_keyerror(self):
        hash_map = HashMap()
        hash_map["moo"] = True

        with pytest.raises(KeyError):
            hash_map.remove("foo")
Esempio n. 8
0
    def test_remove(self):
        hash_map = HashMap()
        hash_map["moo"] = True

        assert hash_map.remove("moo") == True
        assert len(hash_map) == 0
Esempio n. 9
0
class HashMapTest(unittest.TestCase):
    def setUp(self):
        self.hashmap = HashMap()

    def populate(self, values):
        for value in values:
            self.hashmap.put(*value)

    def remove(self, values):
        for value in values:
            self.hashmap.remove(value)

    def test_put(self):
        # Can add to hashmap
        self.hashmap.put('Apples', 5)
        self.assertEqual(self.hashmap.get('Apples'), 5)

        # Size should increase with added elements
        self.assertEqual(self.hashmap.size(), 1)

        # Hashmap should no longer be marked as empty
        self.assertEqual(self.hashmap.is_empty(), False)

        # Should still work with multiple items added
        fruits = [('Oranges', 1), ('Pineapples', 10), ('Mangos', 7),
                  ('Grapefruit', 9), ('Avocado', 53), ('Blueberry', 16),
                  ('Strawberries', 42), ('Cherries', 21), ('Durian', 18),
                  ('Guava', 99), ('Blackberries', 53), ('Cranberries', 42)]

        self.populate(fruits)

        # All inputted items should be retrievable
        for fruit in fruits:
            self.assertEqual(self.hashmap.get(fruit[0]), fruit[1])

        self.assertEqual(self.hashmap.size(), len(fruits) + 1)

        # Should be able to override pre-existing values
        self.hashmap.put('Apples', 20)
        self.assertEqual(self.hashmap.get('Apples'), 20)

        # Should not increase hashmap size
        self.assertEqual(self.hashmap.size(), len(fruits) + 1)

    def test_remove(self):
        # Should work if hashmap contains only one element in bucket
        self.hashmap.put('Apples', 15)
        self.hashmap.remove('Apples')
        self.assertEqual(self.hashmap.get('Apples'), None)

        fruits = [('Oranges', 1), ('Bananas', 2), ('Pineapples', 10),
                  ('Mangos', 7)]
        self.populate(fruits)

        # Should remove pre-existing element
        self.hashmap.remove('Bananas')
        self.assertEqual(self.hashmap.get('Bananas'), None)

        # Size should decrease
        self.assertEqual(self.hashmap.size(), len(fruits) - 1)

        for fruit in fruits:
            self.hashmap.remove(fruit[0])

        # Hash Map should be empty
        self.assertEqual(self.hashmap.size(), 0)
        self.assertEqual(self.hashmap.is_empty(), True)

    def test_resize(self):
        # Initialize HashMap with Initial Capacity of 4
        self.hashmap = HashMap(4)
        self.assertEqual(self.hashmap.capacity(), 4)

        fruits = [('Oranges', 1), ('Bananas', 2), ('Pineapples', 10),
                  ('Mangos', 7)]
        self.populate(fruits)

        # Hashmap should double in capacity
        self.assertEqual(self.hashmap.size(), 4)
        self.assertEqual(self.hashmap.capacity(), 8)

        # Items should still be accessible
        for fruit in fruits:
            self.assertEqual(self.hashmap.get(fruit[0]), fruit[1])

        for fruit in fruits:
            self.hashmap.remove(fruit[0])

        # Hashmap should halve in size
        self.assertEqual(self.hashmap.capacity(), 4)

    def test_mixed_calls(self):
        fruits = [('Oranges', 1), ('Pineapples', 10), ('Mangos', 7),
                  ('Grapefruit', 9), ('Avocado', 53), ('Blueberries', 16),
                  ('Strawberries', 42), ('Cherries', 21), ('Durian', 18),
                  ('Guava', 99), ('Blackberries', 53), ('Cranberries', 42)]

        self.populate(fruits)

        # Hashmap capacity should increase
        self.assertEqual(self.hashmap.capacity() > 8, True)

        fruits_to_remove = {'Grapefruit', 'Cherries', 'Guava', 'Oranges'}

        # Remove fruits from hashmap
        for fruit in fruits_to_remove:
            self.hashmap.remove(fruit)

        # Checks to make sure they are all deleted
        self.remove(fruits_to_remove)

        remaining = len(fruits) - len(fruits_to_remove)
        self.assertEqual(self.hashmap.size(), remaining)

        # Make sure all other fruits are still fine
        for fruit, val in fruits:
            if fruit in fruits_to_remove: continue
            self.assertEqual(self.hashmap.get(fruit), val)

        # Add some more fruits
        additional_fruits = [('Longan', 32), ('Pomegranate', 82),
                             ('Papaya', 92)]
        self.populate(additional_fruits)

        # Size should update accordingly
        new_size = remaining + len(additional_fruits)
        self.assertEqual(self.hashmap.size(), new_size)

        # Updating some existing fruit values
        updates = [('Papaya', 53), ('Cranberries', 32), ('Durian', 9)]
        self.populate(updates)

        # Size should not increase
        self.assertEqual(self.hashmap.size(), new_size)

        additional_fruits_to_remove = {
            'Longan', 'Pomegranate', 'Papaya', 'Strawberries', 'Blueberries',
            'Blackberries', 'Durian', 'Cranberries'
        }
        fruits_to_remove = fruits_to_remove.union(additional_fruits_to_remove)

        self.remove(fruits_to_remove)
        # Hashmap size should be a quarter of its capacity, capacity should halve
        self.assertEqual(self.hashmap.capacity(), 8)