From f08b26a4a2a75b2557d559499acf0110cdaeb626 Mon Sep 17 00:00:00 2001 From: Caleb Fontenot Date: Tue, 13 Feb 2024 20:17:38 -0600 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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