zoukankan      html  css  js  c++  java
  • 自定义线性结构-数组方式

    /**
    * @desc   : 线性接口定义,继承Iterable接口,目的是要foreach
    * @author : 毛会懂
    * @create: 2020/12/25 14:22:00
    **/
    public interface MyList<T> extends Iterable<T> {
        //增加元素
        void add(T t);
    
        //在指定位置增加元素
        void add(Integer i,T t);
    
        //删除指定位置的元素,并返回此元素
        T remove(Integer i);
    
        //修改元素
        void update(int i, T t);
    
        //查询指定位置的元素
        T get(int i);
    
        //查找元素第一次出现的位置
        Integer indexOf(T t);
    
        //是否为空
        Boolean isEmpty();
    
        //元素个数
        Integer length();
    
        //清空表
        void clean();
    }
    
    /**
     * @desc: 自定义线性结构-数组实现
     * @author: 毛会懂
     * @create: 2020-12-25 13:25:00
     **/
    public class MyArrayList<T> implements MyList<T>{
        private T[] arr;
        private Integer N;
    
        public MyArrayList(Integer capacity){
            arr = (T[])new Object[capacity];
            N = 0;
        }
    
        //增加元素
        @Override
        public void add(T t){
            //扩容
            if(N == arr.length){
                resize(N * 2);
            }
            arr[N++] = t;
        }
    
        //在指定位置增加元素
        @Override
        public void add(Integer i,T t){
            //扩容
            if(N == arr.length){
                resize(N * 2);
            }
    
            if(i < 0 || i > N){
                throw new RuntimeException("当前元素不存在");
            }
            for(int index = N;index > i;index--){
                arr[index] = arr[index -1];
            }
            arr[i] = t;
            N++;
        }
    
        //删除指定位置的元素,并返回此元素
        @Override
        public T remove(Integer i){
            //缩容
            if(N > 0 && N < arr.length / 4){
                resize(arr.length / 4);
            }
    
            if(i < 0 || i >= N){
                throw new RuntimeException("当前位置不存在");
            }
            T t = arr[i];
            for(int index = i;index<N-1;index++){
                arr[index] = arr[index+1];
            }
            N--;
            return t;
        }
    
        //修改元素
        @Override
        public void update(int i, T t){
            if(i < 0 || i >= N){
                throw new RuntimeException("当前元素不存在");
            }
            arr[i] = t;
        }
    
        //查询指定位置的元素
        @Override
        public T get(int i){
            if(i < 0 || i >= N){
                throw new RuntimeException("当前元素不存在");
            }
            return arr[i];
        }
    
        //查找元素第一次出现的位置
        @Override
        public Integer indexOf(T t){
            if(t == null){
                throw new RuntimeException("元素不能为空");
            }
            for(int i = 0;i < N;i++){
                if(arr[i].equals(t)){
                    return i;
                }
            }
            return -1;
        }
    
        //是否为空
        @Override
        public Boolean isEmpty(){
            return N == 0;
        }
    
        //元素个数
        @Override
        public Integer length(){
            return N;
        }
    
        //清空表
        @Override
        public void clean(){
            N = 0;
        }
    
        //扩容与缩容
        public void resize(Integer newSize){
            T[] newArr = (T[])new Object[newSize];
            System.arraycopy(arr,0,newArr,0,N);
            arr = newArr;
        }
    
    
        //遍历集合的方式一般都是用的是foreach循环,如果想让我们的MyArrayList也能支持foreach循环,则
        //需要做如下操作(为了更方便,MyList接口继承Iterable接口):
        // 1.让MyArrayList实现Iterable接口,重写iterator方法;
        // 2.在MyArrayList内部提供一个内部类myIterator,实现Iterator接口,重写hasNext方法和next方法;
        @Override
        public Iterator<T> iterator() {
            return new myIterator();
        }
    
        private class myIterator implements Iterator{
            private int current;
            @Override
            public boolean hasNext() {
                return current < N;
            }
    
            @Override
            public Object next() {
                return arr[current++];
            }
        }
    }
    
    
    public class Main {
        public static void main(String[] args) {
            MyList<Integer> list = new MyArrayList(3);
            list.add(1);
            list.add(2);
            list.add(3);
            list.add(4);
            list.add(5);
            list.add(6);
            list.add(7);
            list.add(8);
            System.out.println(list.indexOf(2));
            list.remove(1);
            list.add(0,-1);
            list.update(0,-2);
            System.out.println(list.isEmpty());
            System.out.println(list.length());
            System.out.println(list.get(0));
            //list.clean();
            System.out.println(list.length());
            System.out.println("----------------");
            for (Integer i : list){
                System.out.println(i);
            }
            System.out.println("-------------");
            list.forEach(System.out::println);
            System.out.println("--------");
            Iterator<Integer> iterator = list.iterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }
        }
    }
  • 相关阅读:
    获取ocx运行路径的另一种方法
    使用D3D渲染YUV视频数据
    C++(MFC)中WebBrowser去除3D边框的方法(实现IDocHostUIHandler接口)
    ActiveX控件的安全初始化和脚本操作 和 数字签名SIGN
    解决Eclipse中的卡死现象
    Http请求头和响应头
    HTTP请求头与响应头
    centos7 Mariadb5.5升级到Mariadb10.2
    window下利用navicat访问Linux下的mariadb数据库
    在Linux上安装及配置MariaDB
  • 原文地址:https://www.cnblogs.com/maohuidong/p/14189011.html
Copyright © 2011-2022 走看看