zoukankan      html  css  js  c++  java
  • 线性表(java)

    线性表

    概念:零个或者多个数据元素的有限序列。

    特点:除了第一个元素没有前驱结点,最后一个元素没有后继结点外,其它元素有且仅有一个直接前驱和一个直接后继结点。元素的个数必定为有限个。

    实现:

    定义一个接口:

    public interface List {
        public void add(int index,Object element);//在指定下标添加元素
        public boolean isEmpty();//判断线性表是否为空
        public int size();//线性表中当前元素的个数
        public Object get(int index);//获得指定下标的元素
        public void remove(int index);//删除指定下标的元素
    }

    实现线性表

    public class SeqList implements List {
        final static int defaultSize=10;//默认长度
        int maxSize;//最大长度
        int size;//当前元素的个数
        Object []array;//存储线性表
        
        //初始化
        public SeqList(){
            this(defaultSize);
        }
        public SeqList(int sz){
            maxSize=sz;
            this.size=0;
            array=new Object[sz];
        }
        @Override
        public void add(int index, Object element) {
            if(index>size||index<0){
                System.out.println("插入下标错误");
            }
            if(size==maxSize){
                System.out.println("线性表已经满了,无法进行插入");
            }
            
            System.arraycopy(array, index, array, index+1, size-index);
            array[index]=element;
            size++;
        }
    
        @Override
        public boolean isEmpty() {
            return size==0;
        }
    
        @Override
        public int size() {
            return size;
        }
    
        @Override
        public Object get(int index) {
            if(index>size||index<0){
                System.out.println("获得下标位置出错");
            }
            if(size==0){
                System.out.println("线性表为空");
            }
            return array[index];
        }
    
        @Override
        public Object remove(int index) {
            if(size==0){
                System.out.println("线性表为空");
            }
            if(index>size-1){
                System.out.println("删除下标有误");
            }
            Object l=array[index];
            System.arraycopy(array, index+1, array, index, size-index-1);
            size--;
            return l;
        }
    
        @Override
        public void ensureCapacity(int minCapacity) {
            // TODO Auto-generated method stub
    
        }
    
    }

    线性表的查找效率高,但是插入和删除要移动大量元素所以效率比较低。

    ArrayList简易版实现

    import java.util.Arrays;
    
    public class MyList implements List{
        private int size;
        private Object []array;
        
        public MyList(){
            this(10);
        }
        
        public MyList(int initCapacity) {
            super();
            if(initCapacity<=0){
                throw new IllegalArgumentException("下标不正确!");
            }else{
                this.array=new Object[initCapacity];
            }
        }
        
        @Override
        public void add(int index, Object element) {
            if(index<0||index>size){
                throw new IllegalArgumentException("下标不正确!");
            }
            ensureCapacity(size+1);
            System.arraycopy(array, index, array, index, size-index);
            array[index]=element;
            size++;
        }
    
        @Override
        public boolean isEmpty() {
            return size==0;
        }
    
        @Override
        public int size() {
            return size;
        }
    
        @Override
        public Object get(int index) {
            if(index<0||index<size){
                throw new IllegalArgumentException("下标不正确!");
            }
            return array[index];
        }
    
        @Override
        public Object remove(int index) {
            if(size==0){
                System.out.println("线性表为空");
            }
            if(index>size-1){
                System.out.println("删除下标有误");
            }
            Object l=array[index];
            System.arraycopy(array, index+1, array, index, size-index-1);
            size--;
            return l;
        }
    
        @Override
        public void ensureCapacity(int minCapacity) {//实现扩容
            int oldCapacity=array.length;
            if(oldCapacity<minCapacity){
                Object oldData[]=array;
                int newCapacity=(oldCapacity*3)/2+1;
                if(newCapacity<minCapacity){
                    newCapacity=minCapacity;
                }
                array=Arrays.copyOf(oldData, newCapacity);
            }
        }
    
    }
  • 相关阅读:
    RocketMQ中Producer消息的发送源码分析
    VS等待调试
    Window&Linux遍历某一文件夹
    遍历当前USB设备信息
    批处理常用符号详解
    Windows 批处理(bat)语法大全
    Windows CMD命令大全(值得收藏)
    遍历文件夹
    ASCII,UTF-8,Unicode字符串相互转换
    shellexecute的使用和X64判断
  • 原文地址:https://www.cnblogs.com/coderising/p/5705137.html
Copyright © 2011-2022 走看看