import static java.lang.Math.abs;
import java.util.ArrayList;
import java.util.List;
class CustomHashMap {
    private class KeyValue {
        private String key;
        private String val;
        public KeyValue next = null;
        KeyValue(String k, String v, KeyValue n) {
            key = k;
            val = v;
            next = n;
        }
        public String getKey() {
            return key;
        }
        public String getValue() {
            return val;
        }
    }
    private final List < KeyValue > map = new ArrayList < > ();
    private final int BUCKET_SIZE = 10;
    public void init() {
        for (int i = 0; i < BUCKET_SIZE; i++) {
            map.add(null);
        }
    }
    public CustomHashMap() {
        init();
    }
    private int getHash(String key) {
        int hash = key.hashCode();
        hash = abs(hash % BUCKET_SIZE);
        return hash;
    }
    public Boolean add(String key, String val) {
        int hash = getHash(key);
        try {
            if (map.get(hash) == null) {
                map.set(hash, new KeyValue(key, val, null));
            } else {
                KeyValue temp = new KeyValue(key, val, map.get(hash));
                map.set(hash, temp);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    public String get(String key) throws Exception {
        int hash = getHash(key);
        if (map.get(hash) != null) {
            KeyValue temp = map.get(hash);
            while (temp != null) {
                if (temp.getKey().equals(key)) {
                    return temp.getValue();
                }
                temp = temp.next;
            }
        }
        throw new Exception("Specified key doesn't exists");
    }
    public Boolean remove(String key) throws Exception {
        int hash = getHash(key);
        try {
            if (map.get(hash) != null) {
                KeyValue temp = map.get(hash);
                KeyValue parent = null;
                while (temp != null) {
                    if (temp.getKey().equals(key)) {
                        if (parent == null) {
                            map.set(hash, temp.next);
                        } else {
                            parent.next = temp.next;
                            // delete temp
                            temp.next = null;
                        }
                        return true;
                    }
                    temp = temp.next;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
}
public class Main {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        CustomHashMap abc = new CustomHashMap();
        try {
            abc.add("abc", "def");
            abc.add("abdefc", "askjfhdjf");
            System.out.println(abc.get("abdefc"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
// Credit to https://github.com/riteshkukreja/Custom-HashMap/blob/master/src/customhashmap/CustomHashMap.java