In this assignment, you will implement a generic map interface in two ways: as a hash table with another map implementation from the activity (attached) If you prefer, you may implement and test maps of Strings (sample code in the right column below). You should use normal Java arrays for storage, not ArrayList or other classes from the Java Collections API. Your submission should be a zip file that includes the following files: IMap.java (below, no changes needed) IMapTest.java, HashMapTest.java, and OtherMapTest.java (below, no changes needed) use the first column for Generic version, second column for String version HashMap.java (your hash table implementation) (Here is the main task) OtherMap.java (your other implementation) (Here is the main task) Sample Code for Generics Sample Code for Strings (not Generic) interface IMap { boolean del (int key); // delete key & its value T get (int key); // get value for key boolean put (int key, T val); // put key,value in map boolean hasKey(int key); // is key in map? boolean hasVal(T val); // is val in map? void clear (); // remove all keys & values String dump (); // return String with contents int size (); // return # of pairs } interface IMap { boolean del (int key); // delete key & its value String get (int key); // get value for key boolean put (int key, String val); // put key,value in map boolean hasKey(int key); // is key in map? boolean hasVal(String val); // is val in map? void clear (); // remove all keys & values String dump (); // return String with contents int size (); // return # of pairs } import static org.junit.Assert.*; import org.junit.*; public abstract class IMapTest { protected IMap map; // each subclass should initialize map and then call super.before() public void before() { assertNotNull(this.map); this.map.put(1,"one"); } @After public void after() { this.map = null; } @Test public void constructor() { assertNotNull(this.map); } @Test public void clear() { assertEquals(1, this.map.size()); this.map.clear(); assertEquals(0, this.map.size()); } @Test public void del() { assertEquals(1, this.map.size()); assertFalse ( this.map.del(0)); assertTrue ( this.map.del(1)); assertFalse ( this.map.del(1)); assertEquals(0, this.map.size()); } @Test public void get() { assertNull ( this.map.get(0)); assertEquals("one", this.map.get(1)); } @Test public void has() { assertTrue (this.map.hasKey(1)); assertTrue (this.map.hasVal("one")); assertFalse(this.map.hasKey(3)); .