自己动手系列----使用数组实现一个简单的Set

Set:注重独一无二的性质,该体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。主要有HashSet和TreeSet两大实现类。

Set:

  在判断重复元素的时候,Set集合会调用hashCode()和equal()方法来实现。
  HashSet是哈希表结构,主要利用HashMap的key来存储元素,计算插入元素的hashCode来获取元素在集合中的位置;
  TreeSet是红黑树结构,每一个元素都是树中的一个节点,插入的元素都会进行排序;

详细的介绍点击这里

下面展示部分代码:

private E arrElementE[];
    private int size;
    
    @SuppressWarnings("unchecked")
    public ArrImplSet() {
        arrElementE = (E[]) new Object[0];
    }
    
    public ArrImplSet(E [] arr) {
        arrElementE = arr;
        size = arrElementE.length;
    }
    /**
     * 添加元素
     * @param element
     */
    public  void addElement(E element) {
        // 判断元素是否存在
        if (!contains(element)) {
            // 数组是否满了,需要扩容
            if (size == arrElementE.length) {
                incrementArray();
            }
            arrElementE[size ++] = element;
        }
    }
    /**
     * 返回 集合长度
     * @return
     */
    public int size() {
        if (arrElementE != null) {
            return arrElementE.length;
        }else {
            return 0;
        }
    }
    /**
     * 清空集合
     */
    public void  clear() {
        arrElementE = null;
    }
    
    public  String toString() {
        if(arrElementE == null  || arrElementE.length == 0) {
            return "empty";
        }else {
            StringBuilder str = new StringBuilder("[");
            for (int i = 0; i < arrElementE.length; i++) {
                str.append(arrElementE[i]+ ",");
            }
            str.append("]");
            return str.toString();
        }
    }
    
    /**
     * 数组扩容
     */
    @SuppressWarnings("unchecked")
    private void incrementArray() {
        E [] tempArrEs = arrElementE;
        arrElementE = (E[]) new Object[size + 10 ];
        System.arraycopy(tempArrEs, 0, arrElementE, 0, size);
    }

    /**
     * 判断元素是否存在,注意。Set 是可以保存null。
     * @param el
     * @return
     */
    public boolean contains(E el) {
        if (null == el) {
            // 是否已存在null
            for (int i = 0; i < size; i++)            
                if (arrElementE[i] == null) 
                    return true;
        }else {
            for (int i = 0; i < size; i++)
                if (arrElementE[i] == el) 
                    return true;
        }
        // 都不存在,返回false
        return false;
    }
    /**
     * 返回
     * @param index
     * @return
     */
    public E get(int index) {
        if(size <= index) {
            throw new IndexOutOfBoundsException("下标越界了,index:"+index);
        }
        return arrElementE[index];
    }
    
    public static void main(String[] args) {
//        ArrImplSet<String> set = new ArrImplSet<String>();
//        set.addElement("abcdefg");
//        set.addElement("abcdefg");
//        set.addElement("abc5efg");
//        set.addElement("null");
//        System.out.println(set.toString());
        
        ArrImplSet<Integer> set = new ArrImplSet<Integer>();
        set.addElement(1);
        set.addElement(2);
        set.addElement(1);
        set.addElement(null);
//        System.out.println(set.toString());
        for (int i = 0; i < set.size; i++) {
            System.out.println(set.get(i));    
        }
        
    
    }


原文地址:https://www.cnblogs.com/why-home/p/11904087.html