Untitled
unknown
plain_text
3 months ago
5.0 kB
9
Indexable
package maps; import java.util.Iterator; import java.util.Map; /** * @see AbstractIterableMap * @see Map */ public class ArrayMap<K, V> extends AbstractIterableMap<K, V> { // TODO: define a reasonable default value for the following field private static final int DEFAULT_INITIAL_CAPACITY = 5; /* Warning: You may not rename this field or change its type. We will be inspecting it in our secret tests. */ SimpleEntry<K, V>[] entries; // You may add extra fields or helper methods though! private int size; /** * Constructs a new ArrayMap with default initial capacity. */ public ArrayMap() { this(DEFAULT_INITIAL_CAPACITY); } /** * Constructs a new ArrayMap with the given initial capacity (i.e., the initial * size of the internal array). * * @param initialCapacity the initial capacity of the ArrayMap. Must be > 0. */ public ArrayMap(int initialCapacity) { this.entries = this.createArrayOfEntries(initialCapacity); this.size = 0; } /** * This method will return a new, empty array of the given size that can contain * {@code Entry<K, V>} objects. * * Note that each element in the array will initially be null. * * Note: You do not need to modify this method. */ @SuppressWarnings("unchecked") private SimpleEntry<K, V>[] createArrayOfEntries(int arraySize) { /* It turns out that creating arrays of generic objects in Java is complicated due to something known as "type erasure." We've given you this helper method to help simplify this part of your assignment. Use this helper method as appropriate when implementing the rest of this class. You are not required to understand how this method works, what type erasure is, or how arrays and generics interact. */ return (SimpleEntry<K, V>[]) (new SimpleEntry[arraySize]); } @Override public V get(Object key) { for (int i = 0; i < size; i++) { if (equalsKey(key, entries[i].getKey())) { return entries[i].getValue(); } } return null; } @Override public V put(K key, V value) { for (int i = 0; i < size; i++) { if (Object.equals(entries[i].getKey(), key)) { V oldValue = entries[i].getValue(); entries[i].setValue(value); return oldValue; } } if (size == entries.length) { resize(); } entries[size] = new SimpleEntry<>(key, value); size++; return null; } @Override public V remove(Object key) { for (int i = 0; i < size; i++) { if (Object.equals(entries[i].getKey(), key)) { V oldValue = entries[i].getValue(); entries[i] = entries[size - 1]; entries[size - 1] = null; size--; return oldValue; } } return null; } @Override public void clear() { for (int i = 0; i < size; i++) { entries[i] = null; } size = 0; } @Override public boolean containsKey(Object key) { for (int i = 0; i < size; i++) { if (Object.equals(entries[i].getKey(),key)) { return true; } } return false; } @Override public int size() { return size; } private void resize(int newCapacity) { SimpleEntry<K, V>[] newEntries = createArrayOfEntries(newCapacity); for (int i = 0; i < size; i++) { newEntries[i] = entries[i]; } entries = newEntries; } @Override public Iterator<Map.Entry<K, V>> iterator() { // Note: You may or may not need to change this method, depending on whether you // add any parameters to the ArrayMapIterator constructor. return new ArrayMapIterator<>(this.entries); } // TODO: after you implement the iterator, remove this toString implementation // Doing so will give you a better string representation for assertion errors the debugger. private static class ArrayMapIterator<K, V> implements Iterator<Map.Entry<K, V>> { private final SimpleEntry<K, V>[] entries; private final int size; private int currentIndex; public ArrayMapIterator(SimpleEntry<K, V>[] entries) { this.entries = entries; this.size = size; this.currentIndex = 0; } @Override public boolean hasNext() { return currentIndex < size; } @Override public Map.Entry<K, V> next() { if (!hasNext()) { throw new NoSuchElementException(); } return entries[currentIndex++]; } } }
Editor is loading...
Leave a Comment