寒光博客

[java]HashSet的简单实现
MyHashSet 主要用作数据去重 IHashSet interface 定义接口 package _10_Ha...
扫描右侧二维码阅读全文
08
2019/11

[java]HashSet的简单实现

MyHashSet

主要用作数据去重

IHashSet interface

定义接口

package _10_Hash;

import java.util.Iterator;

public interface IHashSet<E> {
    void add(E key);
    E remove(E key);
    void clear();
    boolean contains(E key);
    boolean isEmpty();
    int size();
    Iterator<E> iterator();
}

IHashSet

set只有一个值同时 可以去重所以作为key值
和map类似 所以直接调用MyHashMap中写好的方法
这次的MyHashMap中加入了Iterate 迭代器
Set的Iterate也是直接调用Map的
和修复了一些小BUG

package _10_Hash;

import java.util.Iterator;

public class MyHashSet<E> implements IHashSet<E> {

    private MyHashMap<E, E> map = new MyHashMap<>();

    @Override
    public void add(E key) {
        map.put(key, null);//只需要Key即可
    }

    @Override
    public E remove(E key) {
        return map.remove(key);
    }

    @Override
    public void clear() {
        map.clear();
    }

    @Override
    public boolean contains(E key) {
        return map.containsKey(key);
    }

    @Override
    public boolean isEmpty() {
        return map.isEmpty();
    }

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

    @Override//调用map的迭代器
    public Iterator<E> iterator() {
        Iterator<MyHashMap.Node> iter = map.iterator();
        return new Iterator<E>() {
            @Override
            public boolean hasNext() {
                return iter.hasNext();
            }

            @Override
            public E next() {
                return (E) iter.next().key;
            }
        };
    }

    @Override
    public String toString() {
        Iterator<MyHashMap.Node> iterator = map.iterator();
        StringBuilder sb = new StringBuilder();
        if (iterator.hasNext() == false)
            return null;
        while (iterator.hasNext()) {
            sb.append(iterator.next().key + ",");
        }
        return sb.toString();
    }

}

内部类迭代

//内部类迭代器
    private class MapIterator implements Iterator<MyHashMap.Node> {
        int i = 0;
        Node p = buckets[0];

        @Override
        public boolean hasNext() {
            while (p == null && i < N) {
                i++;
                if (i == N)
                    p = null;
                else
                    p = buckets[i];
            }
            //i是一个非空的桶子 p是链表头
            return p != null;
        }

        @Override
        public Node next() {
            Node res = p;
            p = p.next;
            return res;
        }
    }

    @Override
    public Iterator<MyHashMap.Node> iterator() {
        return new MapIterator();

    }

Test

package _10_Hash;

import org.junit.Before;
import org.junit.Test;

import java.util.Iterator;

public class MyHashSetTest {
    MyHashSet<Integer> set = new MyHashSet<>();

    @Before
    public void add() {
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(1);

    }

    @Test
    public void remove() {
        System.out.println(set);
        set.remove(1);
        System.out.println(set);

    }

    @Test
    public void clear() {
        set.clear();
        System.out.println(set);
    }

    @Test
    public void contains() {
        System.out.println(set.contains(1));
        System.out.println(set.contains(66));
    }

    @Test
    public void isEmpty() {
        System.out.println(set.isEmpty());
        set.clear();
        System.out.println(set.isEmpty());
    }

    @Test
    public void size() {
        System.out.println(set.size());
        set.remove(1);
        System.out.println(set.size());
        System.out.println(set);
        set.clear();
        System.out.println(set.size());
        System.out.println(set);

    }

    @Test
    public void iter() throws Exception {
        Iterator<Integer> iter = set.iterator();
        while (iter.hasNext()) {
            System.out.println(iter.next());
        }
    }

}
本文作者:Author:     文章标题:[java]HashSet的简单实现
本文地址:https://dxoca.cn/java/314.html       百度未收录
版权说明:若无注明,本文皆为“Dxoca's blog (寒光博客)”原创,转载请保留文章出处。
Last modification:November 8th, 2019 at 02:22 pm
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment