• 自己动手系列----使用数组实现一个简单的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));    
            }
            
        
        }


  • 相关阅读:
    安装 logstash
    ES 关于 Index、Type、Document
    java 获取 属性的注释(二)
    outlook 发件人 xxx 代替 xxx 的问题
    EDI 报文发送(拼箱实例)
    微服务拆分之道
    DDD 领域驱动设计之面向对象思想
    如何构建知识体系?
    架构思维:系统容量设计
    接口性能优化技巧
  • 原文地址:https://www.cnblogs.com/why-home/p/11904087.html
Copyright © 2020-2023  润新知