自己写一个Map (实现Map接口并利用散列原理)

class SanMap implements Map {
    private final static int slot = 997;
    private LinkedList[] bucket = new LinkedList[slot];
    int size = 0;

    @Override
    public int size() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public boolean containsKey(Object key) {
        int index = key.hashCode() % slot;
        if (index < 0) index = -index;
        if (bucket[index] == null) return false;
        LinkedList linkedList = bucket[index];
        Iterator iterator = linkedList.iterator();
        while (iterator.hasNext()) {
            Data data = (Data) iterator.next();
            if (data.getKey().equals(key)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public boolean containsValue(Object value) {
        for (int i = 0; i < slot; i++) {
            if (bucket[i] != null) {
                LinkedList linkedList = bucket[i];
                Iterator iterator = linkedList.iterator();
                while (iterator.hasNext()) {
                    Data data = (Data) iterator.next();
                    if (data.getValue().equals(value)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    @Override
    public Object get(Object key) {
        Data datanow = new Data(key, null);
        int index = key.hashCode() % slot;
        if (index < 0) index = -index;
        if (bucket[index] == null) return null;
        LinkedList list = bucket[index];
        ListIterator iterator = list.listIterator();
        while (iterator.hasNext()) {
            Data data = (Data) iterator.next();
            if (data.equals(datanow)) return data.getValue();
        }
        return null;
    }

    @Override
    public Object put(Object key, Object value) {
        Object result = null;
        Data datanow = new Data(key, value);
        int index = key.hashCode() % slot;
        if (index < 0) index = -index;
        if (bucket[index] == null) bucket[index] = new LinkedList();
        LinkedList list = bucket[index];
        ListIterator iterator = list.listIterator();
        boolean found = false;
        while (iterator.hasNext()) {
            Data data = (Data) iterator.next();
            if (data.equals(datanow)) {
                found = true;
                result = data.getValue();
                iterator.set(datanow);
                break;
            }
        }
        if (!found) {
            bucket[index].add(datanow);
            size++;
        }
        return result;
    }

    @Override
    public Object remove(Object key) {
        int index = key.hashCode() % slot;
        if (index < 0) index = -index;
        if (bucket[index] == null) return null;
        LinkedList linkedList = bucket[index];
        size--;
        return linkedList.remove(new Data(key, null));

    }

    @Override
    public void putAll(Map m) {
        Set set = m.entrySet();
        for (Object o : set) {
            Map.Entry oo = (Map.Entry) o;
            put(oo.getKey(), oo.getValue());
        }
    }

    @Override
    public void clear() {
        for (Object key : keySet()) {
            remove(key);
        }
        size = 0;
    }

    @Override
    public Set keySet() {
        Set set = new HashSet();
        for (int i = 0; i < slot; i++) {
            if (bucket[i] != null) {
                Iterator iterator = bucket[i].iterator();
                while (iterator.hasNext()) {
                    set.add(((Data) iterator.next()).getKey());
                }
            }
        }
        return set;
    }

    @Override
    public Collection values() {
        List list = new ArrayList();
        for (int i = 0; i < slot; i++) {
            if (bucket[i] != null) {
                Iterator iterator = bucket[i].iterator();
                while (iterator.hasNext()) {
                    list.add(((Data) iterator.next()).getValue());
                }
            }
        }
        return list;
    }

    @Override
    public Set<Entry> entrySet() {
        Set entries = new HashSet();
        for (int i = 0; i < bucket.length; i++) {
            if (bucket[i] == null) continue;
            ListIterator iterator = bucket[i].listIterator();
            while (iterator.hasNext()) {
                entries.add(iterator.next());
            }
        }
        return entries;
    }

    @Override
    public boolean equals(Object o) {
        return false;
    }

    @Override
    public int hashCode() {
        int j = 0;
        for (int i = 0; i < slot; i++) {
            if (bucket[i] != null) {
                Iterator iterator = bucket[i].iterator();
                Data data = (Data) iterator.next();
                j = j + data.getKey().hashCode();
            }
        }
        return j;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder("[ ");
        for (int i = 0; i < slot; i++) {
            if (bucket[i] != null) {
                Iterator iterator = bucket[i].iterator();
                while (iterator.hasNext()) {
                    Data data = (Data) iterator.next();
                    builder.append(data.getKey() + "=" + data.getValue() + "  ");
                }
            }
        }
        builder.append("]");
        return builder.toString();
    }
}

class Data implements Map.Entry, Comparable {
    private Object key, value;

    Data(Object key, Object value) {
        this.key = key;
        this.value = value;
    }

    @Override
    public int compareTo(Object o) {
        Data data = (Data) o;
        return ((Comparable) key).compareTo(data.key);
    }

    @Override
    public boolean equals(Object obj) {
        return key.equals(((Data) obj).key);
    }

    @Override
    public Object getKey() {
        return key;
    }

    @Override
    public Object getValue() {
        return value;
    }

    @Override
    public Object setValue(Object value) {
        Object result = this.value;
        this.value = value;
        return result;
    }

    @Override
    public String toString() {
        return key + "=" + value;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_38967434/article/details/82316979