From bad6f0e3e22e1e55afad1f53cabb4034732f299c Mon Sep 17 00:00:00 2001 From: Chloe Christine Fontenot Date: Sun, 19 Oct 2025 21:31:19 -0500 Subject: [PATCH] Glad that's over with --- .../Printed HTMLs/MapASDV.html | 813 ++++++++++++++++++ .../nbproject/project.properties | 2 +- .../output-hashed-map-1.pdf | Bin 0 -> 40503 bytes .../src/mapasdv_calebfontenot/ListASDV.java | 3 +- .../src/mapasdv_calebfontenot/MapASDV.java | 778 ++++++++--------- Semester 4/ZIPs/MapASDV_CalebFontenot.zip | Bin 0 -> 70513 bytes 6 files changed, 1198 insertions(+), 398 deletions(-) create mode 100644 Semester 4/Assignments/MapASDV_CalebFontenot/Printed HTMLs/MapASDV.html create mode 100644 Semester 4/Assignments/MapASDV_CalebFontenot/output-hashed-map-1.pdf create mode 100644 Semester 4/ZIPs/MapASDV_CalebFontenot.zip diff --git a/Semester 4/Assignments/MapASDV_CalebFontenot/Printed HTMLs/MapASDV.html b/Semester 4/Assignments/MapASDV_CalebFontenot/Printed HTMLs/MapASDV.html new file mode 100644 index 0000000..fa83e3d --- /dev/null +++ b/Semester 4/Assignments/MapASDV_CalebFontenot/Printed HTMLs/MapASDV.html @@ -0,0 +1,813 @@ + + + +MapASDV.java + + + + +
/home/caleb/ASDV-Java/Semester 4/Assignments/MapASDV_CalebFontenot/src/mapasdv_calebfontenot/MapASDV.java
+
+/*
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
+ */
+package mapasdv_calebfontenot;
+
+/**
+ *
+ * @author caleb
+ */
+//import ListASDV;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.BiConsumer;//needed in putAll
+
+public class MapASDV<K, V> implements Map<K, V>, Cloneable {
+
+    private int capacity = 4;
+    private double loadFactor = 0.75;
+    private ArrayList<ListASDV<EntryASDV<K, V>>> map = new ArrayList<>();
+
+    private Set<K> sharedKeySet = new SharedSet<>();
+    private Set<Entry<K, V>> sharedEntrySet = new SharedSet<>();
+    private Collection<V> sharedValuesCollection = new SharedCollection<>();
+
+    private class SharedCollection<V> extends ArrayList<V> {
+
+        public boolean addValue(V v) {
+            return this.add(v);
+        }
+
+        @Override
+        public boolean remove(Object o) {
+
+            //> The parameter is key not entry if we are here
+            //>>remove value) and key) from the map
+            return MapASDV.this.removeFirstValue(o);
+
+            //>>remove key from shared values set
+            //return super.remove(o);
+        }
+
+        /**
+         * Removes one value from the collection. This method is meant to be called from out class. The overridden remove(Object o) of this inner class, calls the remove of the outer class(MapASDV), and the remove of the outer class, calls remove(V v, boolean callFromOuterClass) instead of remove(Object o) to avoid Stack Overflow when remover of inner calls remove of outer and vice versa.
+         *
+         * @param o - the key
+         * @param callFromOuterClass - dummy variable.
+         * @return true if the key was removed from the Set
+         */
+        public boolean remove(V v, boolean callFromOuterClass) {
+            //remove key from shared keys set
+            boolean b = super.remove(v);
+            return b;
+
+        }
+
+        @Override
+        public Object clone() {
+            return super.clone();
+        }
+
+        @Override
+        public void clear() {
+            super.clear();
+        }
+    }
+
+    private class SharedSet<E> extends HashSet<E> {
+
+        @Override
+        public boolean add(E e) {
+            return super.add(e);
+        }
+
+        @Override
+        public boolean removeAll(Collection<?> c) {
+            return super.removeAll(c);
+        }
+
+        /**
+         * Adds an EntryASDV to the set. It is private and cannot be used by the user of the Set. It is used from the MapASDV to add EntriesASDV to the SharedSet. Without this method we wouldn't be able to create a Set of keys or a Set of entries to give to the user via methods keySet() and entrySet() of this Map
+         *
+         * @param e EntryASDV
+         * @return true if the entry was added false otherwise
+         */
+        private boolean addEntry(E e) {
+            return super.add(e);
+        }
+
+        @Override
+        public boolean remove(Object o) {
+
+            //>if parameter oo is EntryASDV call auxiliary method removeEntry
+            if (o instanceof EntryASDV) {
+                return removeEntry((EntryASDV) o);
+            }
+
+            //> The parameter is key not entry if we are here
+            //>>remove key from the map
+            MapASDV.this.remove(o);
+            //>>remove key from shared keys set
+            return super.remove(o);
+        }
+
+        /**
+         * Removes the entry for the shared set
+         *
+         * @param entry the entry to be removed
+         * @return true if the entry was removed, false otherwise
+         */
+        private boolean removeEntry(EntryASDV<K, V> entry) {
+
+            MapASDV.this.remove(entry.getKey());
+            return super.remove(entry);
+        }
+
+        /**
+         * Removes the key from the set. This method is meant to be called from out class. The overridden remove(Object o) of this inner class calls the remove of the out class, and the remove of the outer class calls remove(K o, boolean callFromOuterClass) instead of remove(Object o) to avoid Stack Overflow when remover of inner calls remove of outer and vice versa.
+         *
+         * @param o - the key
+         * @param callFromOuterClass - dummy variable.
+         * @return true if the key was removed from the Set
+         */
+        public boolean remove(E o, boolean callFromOuterClass) {
+
+            //remove key from shared keys set
+            return super.remove(o);
+        }
+
+        @Override
+        public Object clone() {
+            return super.clone();
+        }
+
+        @Override
+        public void clear() {
+            super.clear();
+        }
+
+    }
+
+    public MapASDV() {
+        for (int i = 0; i < capacity; ++i) {
+            map.add(new ListASDV<EntryASDV<K, V>>());
+        }
+    }
+
+    /**
+     * Double the size of the Map and rehashes the entries of the Map
+     */
+    private void doubleTheSizeOfTheMapAndRehash() {
+        capacity *= 2;
+        //>create a new arrayList of ListsASDV
+        ArrayList<ListASDV<EntryASDV<K, V>>> newMap = new ArrayList<ListASDV<EntryASDV<K, V>>>();
+
+        //>Add at every enetry of the arrayList a new ASDVList
+        for (int i = 0; i < capacity; ++i) {
+            newMap.add(new ListASDV<EntryASDV<K, V>>());
+        }
+
+        //>for the size of the OLD arrayList
+        for (int i = 0; i < map.size(); ++i)//array list
+        {
+            //>> get The ASDVlist at i
+            ListASDV<EntryASDV<K, V>> list = map.get(i);
+
+            //>>for the size() of the ASDVlist
+            for (int j = 0; j < list.size(); ++j) {
+                ///>>>hash and put in the the new array   
+                int index = hash(list.get(j).getKey().hashCode());
+                newMap.get(index).add(list.get(j));
+
+            }
+        }
+        map = newMap;
+    }
+
+    class EntryASDV<K, V> implements Entry<K, V>, Comparable<K> {
+
+        K key;
+        V value;
+
+        public EntryASDV(K key, V value) {
+            this.key = key;
+            this.value = value;
+        }
+
+        @Override
+        public K getKey() {
+            return key;
+        }
+
+        @Override
+        public V getValue() {
+            return value;
+        }
+
+        @Override
+        public V setValue(V value) {
+            V oldValue = this.value;
+            this.value = value;
+            return oldValue;
+        }
+
+        @Override
+        public String toString() {
+            return "EntryASDV{" + "key=" + key + ", value=" + value + '}';
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj == null) {
+                return false;
+            }
+            if (getClass() != obj.getClass()) {
+                return false;
+            }
+            final EntryASDV<?, ?> other = (EntryASDV<?, ?>) obj;
+            if (!Objects.equals(this.key, other.key)) {
+                return false;
+            }
+            return true;
+        }
+
+        /**
+         *
+         * @param o
+         * @return throws IllegalArgumentException if parameter class is not K
+         */
+        @Override
+        public int compareTo(K o) {
+            if (getClass() != o.getClass()) {
+                throw new IllegalArgumentException("ellegal parameter " + o);
+            }
+            return ((Comparable) key).compareTo(o);
+        }
+
+    }
+
+    @Override
+    public int size() {
+        return this.keySet().size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        if (map.size() == 0) {
+            return true;
+        }
+        return false;
+    }
+
+    // done
+    @Override
+    public boolean containsKey(Object key) {
+        String dashes = "---------";
+        System.out.println(dashes + " containsKey(" + key.toString() + ") " + dashes);
+        for (int i = 0; i < map.size(); ++i) {
+            for (int j = 0; j < map.get(i).size(); ++j) {
+                if (map.get(i).get(j).key.equals(key)) {
+                    return true;
+                }
+            }
+
+        }
+        return false;
+    }
+
+    /**
+     * Return an entry of the map
+     *
+     * @param key the key of the entry to be returned
+     * @return the entry, or null if the key is not in the map
+     */
+    private EntryASDV<K, V> getEntryForKey(Object key) {
+        for (ListASDV<EntryASDV<K, V>> list : map) {
+            Iterator<EntryASDV<K, V>> it = list.iterator();
+            while (it.hasNext()) {
+                EntryASDV<K, V> entry = it.next();
+                if (key.equals(entry.getKey())) {
+                    return entry;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns the index of the given key
+     *
+     * @param key a key of the map
+     * @return the index of a key in the map or -1, if the key is not in the map
+     */
+    private int getIndexForKey(Object key) {
+        for (int i = 0; i < map.size(); ++i) {
+            Iterator<EntryASDV<K, V>> it = map.get(i).iterator();
+            while (it.hasNext()) {
+                EntryASDV<K, V> entry = it.next();
+                if (key.equals(entry.getKey())) {
+                    return i;
+                }
+            }
+        }
+        return -1;
+    }
+
+    /**
+     * Returns true if this map maps one or more keys to the specified value. More formally, returns true if and only if this map contains at least one mapping to a value v such that (value==null ? v==null : value.equals(v)). This operation will probably require time linear in the map size for most implementations of the Map interface.
+     *
+     * Parameters: value - value whose presence in this map is to be tested Returns: true if this map maps one or more keys to the specified value Throws: ClassCastException - if the value is of an inappropriate type for this map (optional) NullPointerException - if the specified value is null and this map does not permit null values (optional)
+     *
+     * @param value - value whose presence in this map is to be tested
+     * @return true if this map maps one or more keys to the specified value
+     * @throws NullPointerException - if the specified value is null and this map does not permit null values (optional)
+     */
+    //done
+    @Override
+    public boolean containsValue(Object value) {
+        String dashes = "---------";
+        System.out.println(dashes + " containsValue(" + value.toString() + ") " + dashes);
+        for (int i = 0; i < map.size(); ++i) {
+            for (int j = 0; j < map.get(i).size(); ++j) {
+                if (map.get(i).get(j).value.equals(value)) {
+                    return true;
+                }
+            }
+
+        }
+        return false;
+
+    }
+
+    /**
+     * Returns the value to which the specified key is mapped, or null if this map contains no mapping for the key.
+     *
+     * More formally, if this map contains a mapping from a key k to a value v such that (key==null ? k==null : key.equals(k)), then this method returns v; otherwise it returns null. (There can be at most one such mapping.)
+     *
+     * If this map permits null values, then a return value of null does not necessarily indicate that the map contains no mapping for the key; it's also possible that the map explicitly maps the key to null. The containsKey operation may be used to distinguish these two cases.
+     *
+     * @param key - the key whose associated value is to be returned
+     * @return the value to which the specified key is mapped, or null if this map contains no mapping for the key
+     * @throws NullPointerException - if the specified key is null and this map does not permit null keys (optional)
+     */
+    //done
+    @Override
+    public V get(Object key) {
+        String dashes = "---------";
+        try {
+            System.out.println(dashes + " get(" + key.toString() + ") " + dashes);
+        } catch (NullPointerException ex) {
+            //System.out.println(ex);
+            System.out.println(dashes + " get(" + "null" + ") " + dashes);
+            throw new NullPointerException("null parameter");
+        }
+        Object currentKey = null;
+        for (int i = 0; i < map.size(); ++i) {
+            for (int j = 0; j < map.get(i).size(); ++j) {
+                currentKey = map.get(i).get(j).key;
+                if (currentKey.equals(key)) {
+                    return map.get(i).get(j).value;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Associates the specified value with the specified key in this map (optional operation). If the map previously contained a mapping for the key, the old value is replaced by the specified value. (A map m is said to contain a mapping for a key k if and only if m.containsKey(k) would return true.)
+     *
+     * @param key - key with which the specified value is to be associated
+     * @param value - value to be associated with the specified key
+     * @return the previous value associated with key, or null if there was no mapping for key. (A null return can also indicate that the map previously associated null with key, if the implementation supports null values.)
+     * @throws NullPointerException - if specified key or value is null and this map does not permit null keys
+     */
+    @Override
+    public V put(K key, V value) {
+
+        if (key == null || value == null) {
+            throw new NullPointerException("parm(s) null");
+        }
+
+        //>if contains the key, replace the key's value 
+        EntryASDV<K, V> entry = getEntryForKey(key);
+        if (entry != null) {
+            V oldValue = entry.value;
+            entry.value = value;
+
+            return oldValue;
+        }
+        ///>>hash and put in the array  
+        int code = this.hash(key.hashCode());
+        int index = hash(code);
+
+        ListASDV<EntryASDV<K, V>> list = map.get(index);
+        EntryASDV e = new EntryASDV(key, value);
+        list.add(e);
+
+        //>>add the key to the shared keys-set
+        ((SharedSet<K>) this.sharedKeySet).addEntry(key);
+        ((SharedSet<Entry<K, V>>) this.sharedEntrySet).addEntry(e);
+
+        //>>get the value of this entry
+        V v = list.get(list.size() - 1).getValue();
+
+        //>> add value to the value collection
+        ((SharedCollection<V>) this.sharedValuesCollection).addValue(v);
+
+        //>> if reach 75% capacity double the size
+        if ((double) this.size() / capacity >= 0.75) {
+            this.doubleTheSizeOfTheMapAndRehash();
+        }
+
+        //>>return the value of Entry  just added
+        return v;
+    }
+
+    int hash(int keyHashCode) {
+        int h = hashHash(keyHashCode);
+        return Math.abs(h % capacity - 1);
+    }
+
+    /**
+     * Removes the first entry with the given values.
+     *
+     * @param value - the value to be removed
+     * @return true if removed, false otherwise
+     * @throws NullPointerException if the value is null
+     */
+    private boolean removeFirstValue(Object value) {
+        Iterator<V> iterator = sharedValuesCollection.iterator();
+        while (iterator.hasNext()) {
+            Object o = iterator.next();
+            if (o.equals(value)) {
+                iterator.remove();
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Ensure hash code is evenly distributed
+     *
+     * @param h - hash code
+     * @return evenly distributed hash code
+     */
+    private static int hashHash(int h) {
+        h ^= (h >>> 20) ^ (h >>> 12);
+        return h ^ (h >>> 7) ^ (h >>> 4);
+    }
+
+    // class cast helper method
+    public static <T> T cast(Object o, Class<T> clazz) {
+        return clazz.isInstance(o) ? clazz.cast(o) : null;
+    }
+
+    /**
+     * Removes the mapping for a key from this map if it is present (optional operation). More formally, if this map contains a mapping from key k to value v such that (key==null ? k==null : key.equals(k)), that mapping is removed. (The map can contain at most one such mapping.)
+     *
+     * @param key - key whose mapping is to be removed from the map
+     * @return the previous value associated with key, or null if there was no mapping for key.
+     * @throws NullPointerException - if the specified key is null and this map does not permit null keys
+     */
+    @Override
+    public V remove(Object key) {
+        String dashes = "---------";
+        try {
+            System.out.println(dashes + " remove(" + key.toString() + ") " + dashes);
+        } catch (NullPointerException ex) {
+            System.out.println(ex);
+            System.out.println(dashes + " remove(" + "null" + ") " + dashes);
+            throw new NullPointerException("null parameter");
+        }
+        K currentKey = null;
+        V currentValue = null;
+        EntryASDV<K, V> currentEntry = null;
+        for (int i = 0; i < map.size(); ++i) {
+            for (int j = 0; j < map.get(i).size(); ++j) {
+                currentEntry = map.get(i).get(j);
+                currentKey = currentEntry.key;
+                currentValue = currentEntry.value;
+                if (currentKey.equals(key) || currentValue.equals(key)) {
+                    System.out.println("key: " + currentKey + "; value: " + currentValue);
+                    // remove the entry from the map
+                    map.remove(i);
+                    // remove the key from the shared key set
+                    // duplicate the set so we can iterate through it and not throw a ConcurrentModificationException...
+                    Object[] iterateArray = sharedKeySet.toArray();
+                    for (Object o : iterateArray) {
+                        if (o.equals(currentKey)) {
+                            System.out.println("removing " + o);
+                            System.out.println("remove successful? " + sharedKeySet.remove(currentKey));
+                            break; // we only want to delete the first one
+                        }
+                    }
+                    // remove the value from the shared key map
+                    // duplicate again...
+                    iterateArray = sharedEntrySet.toArray();
+                    for (Object o : iterateArray) {
+                        if (o.equals(currentEntry)) {
+                            System.out.println("removing " + o);
+                            System.out.println("remove successful? " + sharedEntrySet.remove(currentEntry));
+                            break; // we only want to delete the first one
+                        }
+                    }
+                    // Finally, remove the value from sharedValuesCollection
+                    // duplicate again...
+                    iterateArray = sharedValuesCollection.toArray();
+                    for (Object o : iterateArray) {
+                        //System.out.println(o);
+                        if (o.equals(currentValue)) {
+                            System.out.println("removing " + o);
+                            System.out.println("remove successful? " + sharedValuesCollection.remove(o));
+                            break; // we only want to delete the first one
+                        }
+                    }
+                    //for(Object o: sharedValuesCollection.toArray()) System.out.println(o); 
+                    return currentValue;
+                }
+            }
+        }
+        return null;
+
+    }
+
+    /**
+     * Copies all of the mappings from the specified map to this map (optional operation). The effect of this call is equivalent to that of calling put(k, v) on this map once for each mapping from key k to value v in the specified map. The behavior of this operation is undefined if the specified map is modified while the operation is in progress.
+     *
+     * @param m - mappings to be stored in this map
+     * @throws NullPointerException - if the specified map is null, or if this map does not permit null keys or values, and the specified map contains null keys
+     */
+    @Override
+    public void putAll(Map<? extends K, ? extends V> m) {
+        if (m == null) {
+            throw new NullPointerException("null parameter");
+        }
+
+        BiConsumer consumeEachEntry = new BiConsumer<K, V>() {
+            MapASDV<K, V> mapForConsumer = MapASDV.this;
+
+            @Override
+            public void accept(K k, V v) {
+                mapForConsumer.put(k, v);
+            }
+        };
+
+        m.forEach(consumeEachEntry);
+    }
+
+    /**
+     * Removes all of the mappings from this map (optional operation). The map will be empty after this call returns. Any shared sets are also cleared.
+     */
+    @Override
+    public void clear() {
+
+        // Clear everything out by redefining all internal values, and let Java's GC take care of the rest
+        map = new ArrayList<>();
+        sharedKeySet = new SharedSet<K>();
+        sharedEntrySet = new SharedSet<Entry<K, V>>();
+        sharedValuesCollection = new SharedCollection<V>();
+        //capacity = 4;
+        for (int i = 0; i < capacity; ++i) {
+            map.add(new ListASDV<EntryASDV<K, V>>());
+        }
+    }
+
+    /**
+     * Returns a Set view of the keys contained in this map. The set is backed by the map, so changes to the map are reflected in the set, and vice-versa. If the map is modified while an iteration over the set is in progress (except through the iterator's own remove operation), the results of the iteration are undefined. The set supports element removal, which removes the corresponding mapping from the map, via the Iterator.remove, Set.remove, removeAll, retainAll, and clear operations. It does not support the add or addAll operations.
+     *
+     * @return a set view of the keys contained in this map
+     */
+    @Override
+    public Set<K> keySet() {
+
+        return this.sharedKeySet;
+    }
+
+    /**
+     * Returns a Collection view of the values contained in this map. The collection is backed by the map, so changes to the map are reflected in the collection, and vice-versa. If the map is modified while an iteration over the collection is in progress (except through the iterator's own remove operation), the results of the iteration are undefined. The collection supports element removal, which removes the corresponding mapping from the map, via the Iterator.remove, Collection.remove, removeAll, retainAll and clear operations. It does not support the add or addAll operations.
+     *
+     * @return
+     */
+    @Override
+    public Collection<V> values() {
+        return sharedValuesCollection;
+    }
+
+    /**
+     * Returns a Set view of the mappings contained in this map. The set is backed by the map, so changes to the map are reflected in the set, and vice-versa. If the map is modified while an iteration over the set is in progress (except through the iterator's own remove operation, or through the setValue operation on a map entry returned by the iterator) the results of the iteration are undefined. The set supports element removal, which removes the corresponding mapping from the map, via the Iterator.remove, Set.remove, removeAll, retainAll and clear operations. It does not support the add or addAll operations.
+     *
+     *
+     * @return a set view of the mappings contained in this map
+     */
+    @Override
+    public Set<Entry<K, V>> entrySet() {
+        return this.sharedEntrySet;
+    }
+
+    @Override
+    public String toString() {
+        String s = "[ ";
+        for (int i = 0; i < map.size(); ++i) {
+            s += map.get(i).toString() + "\n";
+        }
+        s += " ]";
+
+        return s;
+    }
+
+    /**
+     * Created a deep copy of the MapASDV
+     *
+     * @return the deep copy of the map
+     */
+    @Override
+    public Object clone() {
+        /*
+        MapASDV<K, V> clonedMap = new MapASDV<K, V>();
+
+        //clonedMap.putAll(this);
+       
+        for (ListASDV< EntryASDV<K, V>> list : this.map)
+          {
+            ListASDV< EntryASDV<K, V>>  l =  (ListASDV< EntryASDV<K, V>>) list.clone();
+            clonedMap.map.add(l);      
+          }
+        return clonedMap;
+         */
+
+        MapASDV<K, V> clonedMap = new MapASDV<K, V>();
+        clonedMap.putAll(this);
+        return clonedMap;
+    }
+
+    public static void main(String[] args) {
+
+        MapASDV<String, Integer> map = new MapASDV<>();
+        System.out.println("---------------------------testing put(K, V)");
+        map.put("ann", 20);
+        map.put("coco", 25);
+        System.out.println(map);
+        MapASDV<String, Integer> clonedMap = (MapASDV<String, Integer>) map.clone();
+
+        System.out.println("\n\n---------------------------testing double-the-size-and-rehash by reaching 0.75 load factor with another put(K, V)");
+        map.put("Jonathan", 30);
+        System.out.println(map);
+        map.put("Jonhathan", 45);
+        System.out.println(map);
+        map.put("Alexander", 33);
+        System.out.println(map);
+
+        System.out.println("\n\n---------------------------testing putAll(Map<K,V>)");
+        Map<String, Integer> anotherJavaMap = new HashMap();
+        anotherJavaMap.put("lion king", 45);
+        anotherJavaMap.put("HYENA", 6);
+        map.putAll(anotherJavaMap);
+        System.out.println(map);
+
+        System.out.println("\n\n---------------------------testing containsKey");
+        System.out.println(map.containsKey("Alexander"));
+        System.out.println(map.containsKey("alexander"));
+
+        System.out.println("\n\n---------------------------testing containsValue");
+        System.out.println(map.containsValue(33));
+        System.out.println(map.containsValue(34));
+
+        System.out.println("\n\n---------------------------testing getEntryForKey");
+        Entry<String, Integer> e = map.getEntryForKey("Alexander");
+        System.out.println(map.getEntryForKey("Alexander"));
+        System.out.println(map.getEntryForKey("Alex"));
+
+        System.out.println("\n\n---------------------------testing get");
+        System.out.println(map.get("Alexander"));
+        System.out.println(map.get("Alex"));
+        try {
+            map.get(null);
+        } catch (NullPointerException ex) {
+            System.out.println(ex.getMessage());
+        }
+
+        System.out.println("\n\n---------------------------testing getIndexForKey");
+        System.out.println(map.getIndexForKey("Alexander"));
+        System.out.println(map.getIndexForKey("Alex"));
+
+        System.out.println("\n\n---------------------------testing isEmpty");
+        System.out.println(map.isEmpty());
+
+        System.out.println("\n\n---------------------------testing size");
+        System.out.println(map.size());
+        System.out.println(map);
+
+        System.out.println("\n\n---------------------------testing entrySet()");
+        Set<Entry<String, Integer>> entries = map.entrySet();
+        System.out.println(entries);
+
+        System.out.println("\n\n---------------------------testing keySet()");
+        Set<String> keys = map.keySet();
+        System.out.println(keys);
+
+        System.out.println("\n\n---------------------------testing values()");
+        Collection<Integer> values = map.values();
+        System.out.println(values);
+
+        System.out.println("\n\n---------------------------testing remove( K) coco 25");
+        map.remove("coco");
+        values = map.values();
+        System.out.println("map: " + map);
+        System.out.println("entries: " + entries);
+        System.out.println("keys: " + keys);
+        System.out.println("values: " + values);
+
+        System.out.println("\n\n---------------------------testing Entry-Collection remove  ");
+        entries.remove(e);
+        values = map.values();
+        System.out.println("map: " + map);
+        System.out.println("entries: " + entries);
+        System.out.println("keys: " + keys);
+        System.out.println("values: " + values);
+
+        System.out.println("\n\n---------------------------testing Set Keys remove  ");
+        keys.remove("ann");
+        values = map.values();
+        System.out.println("map: " + map);
+        System.out.println("entries: " + entries);
+        System.out.println("keys: " + keys);
+        System.out.println("values: " + values);
+
+        System.out.println("\n\n---------------------------testing Set Values remove  ");
+        values.remove(45);
+        values = map.values();
+        System.out.println("map: " + map);
+        System.out.println("entries: " + entries);
+        System.out.println("keys: " + keys);
+        System.out.println("values: " + values);
+
+        System.out.println("\n\n---------------------------testing clear  ");
+        map.clear();
+        values = map.values();
+        entries = map.entrySet();
+        keys = map.keySet();
+        System.out.println("map: " + map);
+        System.out.println("entries: " + entries);
+        System.out.println("keys: " + keys);
+        System.out.println("values: " + values);
+
+        System.out.println("\n\n---------------------------testing add of sets and collections  ");
+        try {
+            keys.add("a");
+        } catch (Exception ex) {
+            System.out.println(ex.getMessage());
+        }
+        try {
+            values.add(33);
+        } catch (Exception ex) {
+            System.out.println(ex.getMessage());
+        }
+        try {
+            entries.add(e);
+        } catch (Exception ex) {
+            System.out.println(ex.getMessage());
+        }
+
+        System.out.println("\n\n---------------------------testing clone");
+        System.out.println(clonedMap);
+
+        System.out.println("---------------------------testing put(K, V) AGAIN");
+        map.put("Nicholas", 100);
+        map.put("a", 200);
+        map.put("b", -20);
+        System.out.println(map);
+    }
+
+}
+
+
+ diff --git a/Semester 4/Assignments/MapASDV_CalebFontenot/nbproject/project.properties b/Semester 4/Assignments/MapASDV_CalebFontenot/nbproject/project.properties index 4f04225..b887cc6 100644 --- a/Semester 4/Assignments/MapASDV_CalebFontenot/nbproject/project.properties +++ b/Semester 4/Assignments/MapASDV_CalebFontenot/nbproject/project.properties @@ -71,7 +71,7 @@ jlink.additionalmodules= jlink.additionalparam= jlink.launcher=true jlink.launcher.name=MapASDV_CalebFontenot -main.class=mapasdv_calebfontenot.MapASDV_CalebFontenot +main.class=mapasdv_calebfontenot.MapASDV manifest.file=manifest.mf meta.inf.dir=${src.dir}/META-INF mkdist.disabled=false diff --git a/Semester 4/Assignments/MapASDV_CalebFontenot/output-hashed-map-1.pdf b/Semester 4/Assignments/MapASDV_CalebFontenot/output-hashed-map-1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..79c4a478178bfbc0afc9da22b5f697c0939ffc91 GIT binary patch literal 40503 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 literal 0 HcmV?d00001 diff --git a/Semester 4/Assignments/MapASDV_CalebFontenot/src/mapasdv_calebfontenot/ListASDV.java b/Semester 4/Assignments/MapASDV_CalebFontenot/src/mapasdv_calebfontenot/ListASDV.java index 0aacf92..f34b3cd 100644 --- a/Semester 4/Assignments/MapASDV_CalebFontenot/src/mapasdv_calebfontenot/ListASDV.java +++ b/Semester 4/Assignments/MapASDV_CalebFontenot/src/mapasdv_calebfontenot/ListASDV.java @@ -1330,7 +1330,7 @@ public class ListASDV s += '}'; return s; } - +/** public static void main(String[] args) { class ASDV_ENTRY implements Map.Entry @@ -1685,6 +1685,7 @@ public class ListASDV } } + **/ } diff --git a/Semester 4/Assignments/MapASDV_CalebFontenot/src/mapasdv_calebfontenot/MapASDV.java b/Semester 4/Assignments/MapASDV_CalebFontenot/src/mapasdv_calebfontenot/MapASDV.java index 137c60e..e13f5ec 100644 --- a/Semester 4/Assignments/MapASDV_CalebFontenot/src/mapasdv_calebfontenot/MapASDV.java +++ b/Semester 4/Assignments/MapASDV_CalebFontenot/src/mapasdv_calebfontenot/MapASDV.java @@ -8,7 +8,6 @@ package mapasdv_calebfontenot; * * @author caleb */ - //import ListASDV; import java.util.ArrayList; import java.util.Collection; @@ -20,28 +19,24 @@ import java.util.Objects; import java.util.Set; import java.util.function.BiConsumer;//needed in putAll -public class MapASDV implements Map, Cloneable -{ +public class MapASDV implements Map, Cloneable { private int capacity = 4; private double loadFactor = 0.75; private ArrayList>> map = new ArrayList<>(); - private Set sharedKeySet = new SharedSet(); - private Set> sharedEntrySet = new SharedSet>(); - private Collection sharedValuesCollection = new SharedCollection(); + private Set sharedKeySet = new SharedSet<>(); + private Set> sharedEntrySet = new SharedSet<>(); + private Collection sharedValuesCollection = new SharedCollection<>(); - private class SharedCollection extends ArrayList - { + private class SharedCollection extends ArrayList { - public boolean addValue(V v) - { + public boolean addValue(V v) { return this.add(v); } @Override - public boolean remove(Object o) - { + public boolean remove(Object o) { //> The parameter is key not entry if we are here //>>remove value) and key) from the map @@ -52,19 +47,13 @@ public class MapASDV implements Map, Cloneable } /** - * Removes one value from the collection. This method is meant to be - * called from out class. The overridden remove(Object o) of this inner - * class, calls the remove of the outer class(MapASDV), and the remove - * of the outer class, calls remove(V v, boolean callFromOuterClass) - * instead of remove(Object o) to avoid Stack Overflow when remover of - * inner calls remove of outer and vice versa. + * Removes one value from the collection. This method is meant to be called from out class. The overridden remove(Object o) of this inner class, calls the remove of the outer class(MapASDV), and the remove of the outer class, calls remove(V v, boolean callFromOuterClass) instead of remove(Object o) to avoid Stack Overflow when remover of inner calls remove of outer and vice versa. * * @param o - the key * @param callFromOuterClass - dummy variable. * @return true if the key was removed from the Set */ - public boolean remove(V v, boolean callFromOuterClass) - { + public boolean remove(V v, boolean callFromOuterClass) { //remove key from shared keys set boolean b = super.remove(v); return b; @@ -72,57 +61,45 @@ public class MapASDV implements Map, Cloneable } @Override - public Object clone() - { + public Object clone() { return super.clone(); } @Override - public void clear() - { + public void clear() { super.clear(); } } - private class SharedSet extends HashSet - { + private class SharedSet extends HashSet { @Override - public boolean add(E e) - { - throw new UnsupportedOperationException("Not supported...."); - } - - @Override - public boolean removeAll(Collection c) - { - throw new UnsupportedOperationException("Not supported...."); - } - - /** - * Adds an EntryASDV to the set. It is private and cannot be used by the - * user of the Set. It is used from the MapASDV to add EntriesASDV to - * the SharedSet. Without this method we wouldn't be able to create a - * Set of keys or a Set of entries to give to the user via methods - * keySet() and entrySet() of this Map - * - * @param e EntryASDV - * @return true if the entry was added false otherwise - */ - private boolean addEntry(E e) - { + public boolean add(E e) { return super.add(e); } @Override - public boolean remove(Object o) - { + public boolean removeAll(Collection c) { + return super.removeAll(c); + } + + /** + * Adds an EntryASDV to the set. It is private and cannot be used by the user of the Set. It is used from the MapASDV to add EntriesASDV to the SharedSet. Without this method we wouldn't be able to create a Set of keys or a Set of entries to give to the user via methods keySet() and entrySet() of this Map + * + * @param e EntryASDV + * @return true if the entry was added false otherwise + */ + private boolean addEntry(E e) { + return super.add(e); + } + + @Override + public boolean remove(Object o) { //>if parameter oo is EntryASDV call auxiliary method removeEntry - if (o instanceof EntryASDV) - { + if (o instanceof EntryASDV) { return removeEntry((EntryASDV) o); - } + } //> The parameter is key not entry if we are here //>>remove key from the map @@ -137,145 +114,120 @@ public class MapASDV implements Map, Cloneable * @param entry the entry to be removed * @return true if the entry was removed, false otherwise */ - private boolean removeEntry(EntryASDV entry) - { + private boolean removeEntry(EntryASDV entry) { MapASDV.this.remove(entry.getKey()); return super.remove(entry); } /** - * Removes the key from the set. This method is meant to be called from - * out class. The overridden remove(Object o) of this inner class calls - * the remove of the out class, and the remove of the outer class calls - * remove(K o, boolean callFromOuterClass) instead of remove(Object o) - * to avoid Stack Overflow when remover of inner calls remove of outer - * and vice versa. + * Removes the key from the set. This method is meant to be called from out class. The overridden remove(Object o) of this inner class calls the remove of the out class, and the remove of the outer class calls remove(K o, boolean callFromOuterClass) instead of remove(Object o) to avoid Stack Overflow when remover of inner calls remove of outer and vice versa. * * @param o - the key * @param callFromOuterClass - dummy variable. * @return true if the key was removed from the Set */ - public boolean remove(E o, boolean callFromOuterClass) - { + public boolean remove(E o, boolean callFromOuterClass) { //remove key from shared keys set return super.remove(o); } @Override - public Object clone() - { + public Object clone() { return super.clone(); } @Override - public void clear() - { + public void clear() { super.clear(); } } - public MapASDV() - { - for (int i = 0; i < capacity; ++i) - { + public MapASDV() { + for (int i = 0; i < capacity; ++i) { map.add(new ListASDV>()); - } + } } /** * Double the size of the Map and rehashes the entries of the Map */ - private void doubleTheSizeOfTheMapAndRehash() - { - capacity *= 2; - //>create a new arrayList of ListsASDV + private void doubleTheSizeOfTheMapAndRehash() { + capacity *= 2; + //>create a new arrayList of ListsASDV ArrayList>> newMap = new ArrayList>>(); - - //>Add at every enetry of the arrayList a new ASDVList - for (int i = 0; i < capacity; ++i) - { + + //>Add at every enetry of the arrayList a new ASDVList + for (int i = 0; i < capacity; ++i) { newMap.add(new ListASDV>()); - } - - //>for the size of the OLD arrayList + } + + //>for the size of the OLD arrayList for (int i = 0; i < map.size(); ++i)//array list - { - //>> get The ASDVlist at i + { + //>> get The ASDVlist at i ListASDV> list = map.get(i); - //>>for the size() of the ASDVlist - for (int j = 0; j < list.size(); ++j) - { - ///>>>hash and put in the the new array - int index = hash( list.get(j).getKey().hashCode() ); + //>>for the size() of the ASDVlist + for (int j = 0; j < list.size(); ++j) { + ///>>>hash and put in the the new array + int index = hash(list.get(j).getKey().hashCode()); newMap.get(index).add(list.get(j)); - } - } + } + } map = newMap; } - class EntryASDV implements Entry, Comparable - { + class EntryASDV implements Entry, Comparable { K key; V value; - public EntryASDV(K key, V value) - { + public EntryASDV(K key, V value) { this.key = key; this.value = value; } @Override - public K getKey() - { + public K getKey() { return key; } @Override - public V getValue() - { + public V getValue() { return value; } @Override - public V setValue(V value) - { + public V setValue(V value) { V oldValue = this.value; this.value = value; return oldValue; } @Override - public String toString() - { + public String toString() { return "EntryASDV{" + "key=" + key + ", value=" + value + '}'; } @Override - public boolean equals(Object obj) - { - if (this == obj) - { + public boolean equals(Object obj) { + if (this == obj) { return true; - } - if (obj == null) - { + } + if (obj == null) { return false; - } - if (getClass() != obj.getClass()) - { + } + if (getClass() != obj.getClass()) { return false; - } + } final EntryASDV other = (EntryASDV) obj; - if (!Objects.equals(this.key, other.key)) - { + if (!Objects.equals(this.key, other.key)) { return false; - } + } return true; } @@ -285,38 +237,42 @@ public class MapASDV implements Map, Cloneable * @return throws IllegalArgumentException if parameter class is not K */ @Override - public int compareTo(K o) - { - if (getClass() != o.getClass()) - { + public int compareTo(K o) { + if (getClass() != o.getClass()) { throw new IllegalArgumentException("ellegal parameter " + o); - } + } return ((Comparable) key).compareTo(o); } } @Override - public int size() - { + public int size() { return this.keySet().size(); } @Override - public boolean isEmpty() - { - throw new UnsupportedOperationException("Not supported...."); - + public boolean isEmpty() { + if (map.size() == 0) { + return true; + } + return false; } + // done @Override - public boolean containsKey(Object key) - { + public boolean containsKey(Object key) { + String dashes = "---------"; + System.out.println(dashes + " containsKey(" + key.toString() + ") " + dashes); for (int i = 0; i < map.size(); ++i) { - System.out.println(map.get(i)); - } - throw new UnsupportedOperationException("Not supported yet...."); + for (int j = 0; j < map.get(i).size(); ++j) { + if (map.get(i).get(j).key.equals(key)) { + return true; + } + } + } + return false; } /** @@ -325,20 +281,16 @@ public class MapASDV implements Map, Cloneable * @param key the key of the entry to be returned * @return the entry, or null if the key is not in the map */ - private EntryASDV getEntryForKey(Object key) - { - for (ListASDV> list : map) - { + private EntryASDV getEntryForKey(Object key) { + for (ListASDV> list : map) { Iterator> it = list.iterator(); - while (it.hasNext()) - { + while (it.hasNext()) { EntryASDV entry = it.next(); - if (key.equals(entry.getKey())) - { + if (key.equals(entry.getKey())) { return entry; - } - } - } + } + } + } return null; } @@ -348,107 +300,102 @@ public class MapASDV implements Map, Cloneable * @param key a key of the map * @return the index of a key in the map or -1, if the key is not in the map */ - private int getIndexForKey(Object key) - { - for (int i = 0; i < map.size(); ++i) - { + private int getIndexForKey(Object key) { + for (int i = 0; i < map.size(); ++i) { Iterator> it = map.get(i).iterator(); - while (it.hasNext()) - { + while (it.hasNext()) { EntryASDV entry = it.next(); - if (key.equals(entry.getKey())) - { + if (key.equals(entry.getKey())) { return i; - } - } - } + } + } + } return -1; } /** - * Returns true if this map maps one or more keys to the specified value. - * More formally, returns true if and only if this map contains at least one - * mapping to a value v such that (value==null ? v==null : value.equals(v)). - * This operation will probably require time linear in the map size for most - * implementations of the Map interface. + * Returns true if this map maps one or more keys to the specified value. More formally, returns true if and only if this map contains at least one mapping to a value v such that (value==null ? v==null : value.equals(v)). This operation will probably require time linear in the map size for most implementations of the Map interface. * - * Parameters: value - value whose presence in this map is to be tested - * Returns: true if this map maps one or more keys to the specified value - * Throws: ClassCastException - if the value is of an inappropriate type for - * this map (optional) NullPointerException - if the specified value is null - * and this map does not permit null values (optional) + * Parameters: value - value whose presence in this map is to be tested Returns: true if this map maps one or more keys to the specified value Throws: ClassCastException - if the value is of an inappropriate type for this map (optional) NullPointerException - if the specified value is null and this map does not permit null values (optional) * * @param value - value whose presence in this map is to be tested * @return true if this map maps one or more keys to the specified value - * @throws NullPointerException - if the specified value is null and this - * map does not permit null values (optional) + * @throws NullPointerException - if the specified value is null and this map does not permit null values (optional) */ + //done @Override - public boolean containsValue(Object value) - { - throw new UnsupportedOperationException("Not supported yet...."); + public boolean containsValue(Object value) { + String dashes = "---------"; + System.out.println(dashes + " containsValue(" + value.toString() + ") " + dashes); + for (int i = 0; i < map.size(); ++i) { + for (int j = 0; j < map.get(i).size(); ++j) { + if (map.get(i).get(j).value.equals(value)) { + return true; + } + } + + } + return false; } /** - * Returns the value to which the specified key is mapped, or null if this - * map contains no mapping for the key. + * Returns the value to which the specified key is mapped, or null if this map contains no mapping for the key. * - * More formally, if this map contains a mapping from a key k to a value v - * such that (key==null ? k==null : key.equals(k)), then this method returns - * v; otherwise it returns null. (There can be at most one such mapping.) + * More formally, if this map contains a mapping from a key k to a value v such that (key==null ? k==null : key.equals(k)), then this method returns v; otherwise it returns null. (There can be at most one such mapping.) * - * If this map permits null values, then a return value of null does not - * necessarily indicate that the map contains no mapping for the key; it's - * also possible that the map explicitly maps the key to null. The - * containsKey operation may be used to distinguish these two cases. + * If this map permits null values, then a return value of null does not necessarily indicate that the map contains no mapping for the key; it's also possible that the map explicitly maps the key to null. The containsKey operation may be used to distinguish these two cases. * * @param key - the key whose associated value is to be returned - * @return the value to which the specified key is mapped, or null if this - * map contains no mapping for the key - * @throws NullPointerException - if the specified key is null and this map - * does not permit null keys (optional) + * @return the value to which the specified key is mapped, or null if this map contains no mapping for the key + * @throws NullPointerException - if the specified key is null and this map does not permit null keys (optional) */ + //done @Override - public V get(Object key) - { - throw new UnsupportedOperationException("Not supported yet...."); - + public V get(Object key) { + String dashes = "---------"; + try { + System.out.println(dashes + " get(" + key.toString() + ") " + dashes); + } catch (NullPointerException ex) { + //System.out.println(ex); + System.out.println(dashes + " get(" + "null" + ") " + dashes); + throw new NullPointerException("null parameter"); + } + Object currentKey = null; + for (int i = 0; i < map.size(); ++i) { + for (int j = 0; j < map.get(i).size(); ++j) { + currentKey = map.get(i).get(j).key; + if (currentKey.equals(key)) { + return map.get(i).get(j).value; + } + } + } + return null; } /** - * Associates the specified value with the specified key in this map - * (optional operation). If the map previously contained a mapping for the - * key, the old value is replaced by the specified value. (A map m is said - * to contain a mapping for a key k if and only if m.containsKey(k) would - * return true.) + * Associates the specified value with the specified key in this map (optional operation). If the map previously contained a mapping for the key, the old value is replaced by the specified value. (A map m is said to contain a mapping for a key k if and only if m.containsKey(k) would return true.) * * @param key - key with which the specified value is to be associated * @param value - value to be associated with the specified key - * @return the previous value associated with key, or null if there was no - * mapping for key. (A null return can also indicate that the map previously - * associated null with key, if the implementation supports null values.) - * @throws NullPointerException - if specified key or value is null and this - * map does not permit null keys + * @return the previous value associated with key, or null if there was no mapping for key. (A null return can also indicate that the map previously associated null with key, if the implementation supports null values.) + * @throws NullPointerException - if specified key or value is null and this map does not permit null keys */ @Override - public V put(K key, V value) - { + public V put(K key, V value) { - if (key == null || value == null) - { + if (key == null || value == null) { throw new NullPointerException("parm(s) null"); - } + } //>if contains the key, replace the key's value EntryASDV entry = getEntryForKey(key); - if (entry != null) - { + if (entry != null) { V oldValue = entry.value; entry.value = value; return oldValue; - } + } ///>>hash and put in the array int code = this.hash(key.hashCode()); int index = hash(code); @@ -468,17 +415,15 @@ public class MapASDV implements Map, Cloneable ((SharedCollection) this.sharedValuesCollection).addValue(v); //>> if reach 75% capacity double the size - if ((double) this.size() / capacity >= 0.75) - { + if ((double) this.size() / capacity >= 0.75) { this.doubleTheSizeOfTheMapAndRehash(); - } + } //>>return the value of Entry just added return v; } - int hash(int keyHashCode) - { + int hash(int keyHashCode) { int h = hashHash(keyHashCode); return Math.abs(h % capacity - 1); } @@ -490,10 +435,16 @@ public class MapASDV implements Map, Cloneable * @return true if removed, false otherwise * @throws NullPointerException if the value is null */ - private boolean removeFirstValue(Object value) - { - throw new UnsupportedOperationException("Not supported yet...."); - + private boolean removeFirstValue(Object value) { + Iterator iterator = sharedValuesCollection.iterator(); + while (iterator.hasNext()) { + Object o = iterator.next(); + if (o.equals(value)) { + iterator.remove(); + return true; + } + } + return false; } /** @@ -502,58 +453,102 @@ public class MapASDV implements Map, Cloneable * @param h - hash code * @return evenly distributed hash code */ - private static int hashHash(int h) - { + private static int hashHash(int h) { h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); } + // class cast helper method + public static T cast(Object o, Class clazz) { + return clazz.isInstance(o) ? clazz.cast(o) : null; + } + /** - * Removes the mapping for a key from this map if it is present (optional - * operation). More formally, if this map contains a mapping from key k to - * value v such that (key==null ? k==null : key.equals(k)), that mapping is - * removed. (The map can contain at most one such mapping.) + * Removes the mapping for a key from this map if it is present (optional operation). More formally, if this map contains a mapping from key k to value v such that (key==null ? k==null : key.equals(k)), that mapping is removed. (The map can contain at most one such mapping.) * * @param key - key whose mapping is to be removed from the map - * @return the previous value associated with key, or null if there was no - * mapping for key. - * @throws NullPointerException - if the specified key is null and this map - * does not permit null keys + * @return the previous value associated with key, or null if there was no mapping for key. + * @throws NullPointerException - if the specified key is null and this map does not permit null keys */ @Override - public V remove(Object key) - { - throw new UnsupportedOperationException("Not supported yet...."); + public V remove(Object key) { + String dashes = "---------"; + try { + System.out.println(dashes + " remove(" + key.toString() + ") " + dashes); + } catch (NullPointerException ex) { + System.out.println(ex); + System.out.println(dashes + " remove(" + "null" + ") " + dashes); + throw new NullPointerException("null parameter"); + } + K currentKey = null; + V currentValue = null; + EntryASDV currentEntry = null; + for (int i = 0; i < map.size(); ++i) { + for (int j = 0; j < map.get(i).size(); ++j) { + currentEntry = map.get(i).get(j); + currentKey = currentEntry.key; + currentValue = currentEntry.value; + if (currentKey.equals(key) || currentValue.equals(key)) { + System.out.println("key: " + currentKey + "; value: " + currentValue); + // remove the entry from the map + map.remove(i); + // remove the key from the shared key set + // duplicate the set so we can iterate through it and not throw a ConcurrentModificationException... + Object[] iterateArray = sharedKeySet.toArray(); + for (Object o : iterateArray) { + if (o.equals(currentKey)) { + System.out.println("removing " + o); + System.out.println("remove successful? " + sharedKeySet.remove(currentKey)); + break; // we only want to delete the first one + } + } + // remove the value from the shared key map + // duplicate again... + iterateArray = sharedEntrySet.toArray(); + for (Object o : iterateArray) { + if (o.equals(currentEntry)) { + System.out.println("removing " + o); + System.out.println("remove successful? " + sharedEntrySet.remove(currentEntry)); + break; // we only want to delete the first one + } + } + // Finally, remove the value from sharedValuesCollection + // duplicate again... + iterateArray = sharedValuesCollection.toArray(); + for (Object o : iterateArray) { + //System.out.println(o); + if (o.equals(currentValue)) { + System.out.println("removing " + o); + System.out.println("remove successful? " + sharedValuesCollection.remove(o)); + break; // we only want to delete the first one + } + } + //for(Object o: sharedValuesCollection.toArray()) System.out.println(o); + return currentValue; + } + } + } + return null; } /** - * Copies all of the mappings from the specified map to this map (optional - * operation). The effect of this call is equivalent to that of calling - * put(k, v) on this map once for each mapping from key k to value v in the - * specified map. The behavior of this operation is undefined if the - * specified map is modified while the operation is in progress. + * Copies all of the mappings from the specified map to this map (optional operation). The effect of this call is equivalent to that of calling put(k, v) on this map once for each mapping from key k to value v in the specified map. The behavior of this operation is undefined if the specified map is modified while the operation is in progress. * * @param m - mappings to be stored in this map - * @throws NullPointerException - if the specified map is null, or if this - * map does not permit null keys or values, and the specified map contains - * null keys + * @throws NullPointerException - if the specified map is null, or if this map does not permit null keys or values, and the specified map contains null keys */ - @Override - public void putAll(Map m) - { - if (m == null) - { + @Override + public void putAll(Map m) { + if (m == null) { throw new NullPointerException("null parameter"); - } + } - BiConsumer consumeEachEntry = new BiConsumer() - { + BiConsumer consumeEachEntry = new BiConsumer() { MapASDV mapForConsumer = MapASDV.this; @Override - public void accept(K k, V v) - { + public void accept(K k, V v) { mapForConsumer.put(k, v); } }; @@ -561,84 +556,61 @@ public class MapASDV implements Map, Cloneable m.forEach(consumeEachEntry); } - /** - * Removes all of the mappings from this map (optional operation). The map - * will be empty after this call returns. Any shared sets are also cleared. + * Removes all of the mappings from this map (optional operation). The map will be empty after this call returns. Any shared sets are also cleared. */ @Override - public void clear() - { - throw new UnsupportedOperationException("Not supported yet...."); + public void clear() { + // Clear everything out by redefining all internal values, and let Java's GC take care of the rest + map = new ArrayList<>(); + sharedKeySet = new SharedSet(); + sharedEntrySet = new SharedSet>(); + sharedValuesCollection = new SharedCollection(); + //capacity = 4; + for (int i = 0; i < capacity; ++i) { + map.add(new ListASDV>()); + } } /** - * Returns a Set view of the keys contained in this map. The set is backed - * by the map, so changes to the map are reflected in the set, and - * vice-versa. If the map is modified while an iteration over the set is in - * progress (except through the iterator's own remove operation), the - * results of the iteration are undefined. The set supports element removal, - * which removes the corresponding mapping from the map, via the - * Iterator.remove, Set.remove, removeAll, retainAll, and clear operations. - * It does not support the add or addAll operations. + * Returns a Set view of the keys contained in this map. The set is backed by the map, so changes to the map are reflected in the set, and vice-versa. If the map is modified while an iteration over the set is in progress (except through the iterator's own remove operation), the results of the iteration are undefined. The set supports element removal, which removes the corresponding mapping from the map, via the Iterator.remove, Set.remove, removeAll, retainAll, and clear operations. It does not support the add or addAll operations. * * @return a set view of the keys contained in this map */ @Override - public Set keySet() - { + public Set keySet() { return this.sharedKeySet; } /** - * Returns a Collection view of the values contained in this map. The - * collection is backed by the map, so changes to the map are reflected in - * the collection, and vice-versa. If the map is modified while an iteration - * over the collection is in progress (except through the iterator's own - * remove operation), the results of the iteration are undefined. The - * collection supports element removal, which removes the corresponding - * mapping from the map, via the Iterator.remove, Collection.remove, - * removeAll, retainAll and clear operations. It does not support the add or - * addAll operations. + * Returns a Collection view of the values contained in this map. The collection is backed by the map, so changes to the map are reflected in the collection, and vice-versa. If the map is modified while an iteration over the collection is in progress (except through the iterator's own remove operation), the results of the iteration are undefined. The collection supports element removal, which removes the corresponding mapping from the map, via the Iterator.remove, Collection.remove, removeAll, retainAll and clear operations. It does not support the add or addAll operations. * * @return */ @Override - public Collection values() - { + public Collection values() { return sharedValuesCollection; } /** - * Returns a Set view of the mappings contained in this map. The set is - * backed by the map, so changes to the map are reflected in the set, and - * vice-versa. If the map is modified while an iteration over the set is in - * progress (except through the iterator's own remove operation, or through - * the setValue operation on a map entry returned by the iterator) the - * results of the iteration are undefined. The set supports element removal, - * which removes the corresponding mapping from the map, via the - * Iterator.remove, Set.remove, removeAll, retainAll and clear operations. - * It does not support the add or addAll operations. + * Returns a Set view of the mappings contained in this map. The set is backed by the map, so changes to the map are reflected in the set, and vice-versa. If the map is modified while an iteration over the set is in progress (except through the iterator's own remove operation, or through the setValue operation on a map entry returned by the iterator) the results of the iteration are undefined. The set supports element removal, which removes the corresponding mapping from the map, via the Iterator.remove, Set.remove, removeAll, retainAll and clear operations. It does not support the add or addAll operations. * * * @return a set view of the mappings contained in this map */ @Override - public Set> entrySet() - { + public Set> entrySet() { return this.sharedEntrySet; } @Override - public String toString() - { + public String toString() { String s = "[ "; - for (int i = 0; i < capacity; ++i) - { + for (int i = 0; i < map.size(); ++i) { s += map.get(i).toString() + "\n"; - } + } s += " ]"; return s; @@ -650,8 +622,7 @@ public class MapASDV implements Map, Cloneable * @return the deep copy of the map */ @Override - public Object clone() - { + public Object clone() { /* MapASDV clonedMap = new MapASDV(); @@ -663,24 +634,22 @@ public class MapASDV implements Map, Cloneable clonedMap.map.add(l); } return clonedMap; - */ - - MapASDV clonedMap = new MapASDV(); - clonedMap.putAll(this); - return clonedMap; + */ + + MapASDV clonedMap = new MapASDV(); + clonedMap.putAll(this); + return clonedMap; } - public static void main(String[] args) - { + public static void main(String[] args) { - MapASDV map = new MapASDV(); + MapASDV map = new MapASDV<>(); System.out.println("---------------------------testing put(K, V)"); map.put("ann", 20); map.put("coco", 25); System.out.println(map); - MapASDV clonedMap = ( MapASDV) map.clone(); - - + MapASDV clonedMap = (MapASDV) map.clone(); + System.out.println("\n\n---------------------------testing double-the-size-and-rehash by reaching 0.75 load factor with another put(K, V)"); map.put("Jonathan", 30); System.out.println(map); @@ -688,109 +657,126 @@ public class MapASDV implements Map, Cloneable System.out.println(map); map.put("Alexander", 33); System.out.println(map); - + System.out.println("\n\n---------------------------testing putAll(Map)"); Map anotherJavaMap = new HashMap(); anotherJavaMap.put("lion king", 45); anotherJavaMap.put("HYENA", 6); map.putAll(anotherJavaMap); System.out.println(map); - - - System.out.println("\n\n---------------------------testing containsKey"); - System.out.println(map.containsKey("Alexander")); - System.out.println(map.containsKey("alexander")); - - System.out.println("\n\n---------------------------testing containsValue"); - System.out.println(map.containsValue(33)); - System.out.println(map.containsValue(34)); - - System.out.println("\n\n---------------------------testing getEntryForKey"); - Entry e = map.getEntryForKey("Alexander"); - System.out.println( map.getEntryForKey("Alexander")); - System.out.println( map.getEntryForKey("Alex")); - - System.out.println("\n\n---------------------------testing get"); - System.out.println(map.get( "Alexander") ); - System.out.println(map.get( "Alex") ); - try{ map.get( null);}catch (NullPointerException ex ){System.out.println(ex.getMessage());} - - System.out.println("\n\n---------------------------testing getIndexForKey"); - System.out.println(map.getIndexForKey("Alexander")); - System.out.println(map.getIndexForKey("Alex")); - - System.out.println("\n\n---------------------------testing isEmpty"); - System.out.println( map.isEmpty()); - - - System.out.println("\n\n---------------------------testing size"); - System.out.println( map.size()); - System.out.println( map); - - System.out.println("\n\n---------------------------testing entrySet()"); - Set> entries = map.entrySet(); - System.out.println( entries); - - System.out.println("\n\n---------------------------testing keySet()"); - Set keys = map.keySet(); - System.out.println( keys ); - - System.out.println("\n\n---------------------------testing values()"); - Collection values = map.values(); - System.out.println( values); - - System.out.println("\n\n---------------------------testing remove( K) coco 25"); - map.remove("coco"); - System.out.println(map); - System.out.println(entries); - System.out.println(keys); - System.out.println(values); - - System.out.println("\n\n---------------------------testing Entry-Collection remove "); - entries.remove( e); - System.out.println(map); - System.out.println(entries); - System.out.println(keys); - System.out.println(values); - - - System.out.println("\n\n---------------------------testing Set Keys remove "); - keys.remove( "ann"); - System.out.println(map); - System.out.println(entries); - System.out.println(keys); - System.out.println(values); - - - System.out.println("\n\n---------------------------testing Set Values remove "); - values.remove( 45); - System.out.println(map); - System.out.println(entries); - System.out.println(keys); - System.out.println(values); - - System.out.println("\n\n---------------------------testing clear "); - map.clear(); - System.out.println(map); - System.out.println(entries); - System.out.println(keys); - - System.out.println("\n\n---------------------------testing add of sets and collections "); - try{ keys.add( "a");}catch (Exception ex ){System.out.println(ex.getMessage());} - try{ values.add( 33);}catch (Exception ex ){System.out.println(ex.getMessage());} - try{ entries.add( e);}catch (Exception ex ){System.out.println(ex.getMessage());} - - - System.out.println("\n\n---------------------------testing clone"); - System.out.println( clonedMap); - - System.out.println("---------------------------testing put(K, V) AGAIN"); + System.out.println("\n\n---------------------------testing containsKey"); + System.out.println(map.containsKey("Alexander")); + System.out.println(map.containsKey("alexander")); + + System.out.println("\n\n---------------------------testing containsValue"); + System.out.println(map.containsValue(33)); + System.out.println(map.containsValue(34)); + + System.out.println("\n\n---------------------------testing getEntryForKey"); + Entry e = map.getEntryForKey("Alexander"); + System.out.println(map.getEntryForKey("Alexander")); + System.out.println(map.getEntryForKey("Alex")); + + System.out.println("\n\n---------------------------testing get"); + System.out.println(map.get("Alexander")); + System.out.println(map.get("Alex")); + try { + map.get(null); + } catch (NullPointerException ex) { + System.out.println(ex.getMessage()); + } + + System.out.println("\n\n---------------------------testing getIndexForKey"); + System.out.println(map.getIndexForKey("Alexander")); + System.out.println(map.getIndexForKey("Alex")); + + System.out.println("\n\n---------------------------testing isEmpty"); + System.out.println(map.isEmpty()); + + System.out.println("\n\n---------------------------testing size"); + System.out.println(map.size()); + System.out.println(map); + + System.out.println("\n\n---------------------------testing entrySet()"); + Set> entries = map.entrySet(); + System.out.println(entries); + + System.out.println("\n\n---------------------------testing keySet()"); + Set keys = map.keySet(); + System.out.println(keys); + + System.out.println("\n\n---------------------------testing values()"); + Collection values = map.values(); + System.out.println(values); + + System.out.println("\n\n---------------------------testing remove( K) coco 25"); + map.remove("coco"); + values = map.values(); + System.out.println("map: " + map); + System.out.println("entries: " + entries); + System.out.println("keys: " + keys); + System.out.println("values: " + values); + + System.out.println("\n\n---------------------------testing Entry-Collection remove "); + entries.remove(e); + values = map.values(); + System.out.println("map: " + map); + System.out.println("entries: " + entries); + System.out.println("keys: " + keys); + System.out.println("values: " + values); + + System.out.println("\n\n---------------------------testing Set Keys remove "); + keys.remove("ann"); + values = map.values(); + System.out.println("map: " + map); + System.out.println("entries: " + entries); + System.out.println("keys: " + keys); + System.out.println("values: " + values); + + System.out.println("\n\n---------------------------testing Set Values remove "); + values.remove(45); + values = map.values(); + System.out.println("map: " + map); + System.out.println("entries: " + entries); + System.out.println("keys: " + keys); + System.out.println("values: " + values); + + System.out.println("\n\n---------------------------testing clear "); + map.clear(); + values = map.values(); + entries = map.entrySet(); + keys = map.keySet(); + System.out.println("map: " + map); + System.out.println("entries: " + entries); + System.out.println("keys: " + keys); + System.out.println("values: " + values); + + System.out.println("\n\n---------------------------testing add of sets and collections "); + try { + keys.add("a"); + } catch (Exception ex) { + System.out.println(ex.getMessage()); + } + try { + values.add(33); + } catch (Exception ex) { + System.out.println(ex.getMessage()); + } + try { + entries.add(e); + } catch (Exception ex) { + System.out.println(ex.getMessage()); + } + + System.out.println("\n\n---------------------------testing clone"); + System.out.println(clonedMap); + + System.out.println("---------------------------testing put(K, V) AGAIN"); map.put("Nicholas", 100); map.put("a", 200); map.put("b", -20); - System.out.println( map); + System.out.println(map); } } - diff --git a/Semester 4/ZIPs/MapASDV_CalebFontenot.zip b/Semester 4/ZIPs/MapASDV_CalebFontenot.zip new file mode 100644 index 0000000000000000000000000000000000000000..b34dc07b83028d77b5187e60df31d2db8f8db8fe GIT binary patch literal 70513 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

o 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 literal 0 HcmV?d00001