zoukankan      html  css  js  c++  java
  • java实现顺序线性表

    线性表的实现可以是顺序的(数组实现),也可以是非顺序(链式)的,
    如下便是顺序表的实现,相当于简化版的java工具类中ArrayList。链式结构的实现(实现为一个双向链表),相当于java工具类中LinkedList,具体实现可以参考这里

    MyList为自定义的一个线性表接口,说明了一些线性表应该具有的功能:

    package com.nonefly.list;
    /**
     * 线性表接口
     * @author nonefly
     */
    public interface MyList<T> {
        
        /** @return size 线性表元素个数*/
        public int length();
        
        /**
         *  获得索引i处元素
         * @param index 线性表索引
         * @return 第i处元素
         */
        public T get(int index);
        
        /**
         * 获得指定元素索引
         * @param element 查询元素
         * @return 索引
         */
        public int indexOf(T element);
        
        /**
         * 指定索引插入元素
         * @param index 插入索引
         * @param element 插入元素
         */
        public void insert (int index, T element );
        
        /**
         * 顺序表末尾插入元素
         * @param element
         */
        public void add(T element);
        
        /**
         * 删除指定索引元素
         * @param index 索引
         * @return 删除元素
         */
        public T delete (int index );
        
        /**
         * 删除最后一个
         * @return 删除元素
         */
        public T remove();
        
        /**
         * 判断顺序表是否为空
         * @return boolean
         */
        public boolean isEmpty();
        
        /**
         * 清空顺序表
         */
        public void clear();
        
    }
    

    下面是顺序线性表的实现(通过数组来存储表中元素),它实现了MyList接口中的方法,同时添加了自己的一些方法,如:为了输出方便,重写了toString等.

    事实上,在这里用接口只是为了方便提醒自己不要漏掉某些重要功能,在练习表的实现中,不实现MyList接口也可以正确运行。

    package com.nonefly.list;
    import java.util.Arrays;
    public class MyArrayList<T> implements MyList<T>{
        private int size = 0;
        private int capacity;
        private Object[] elementData;
         
        public MyArrayList(int initialCapacity) {
            capacity = 1;
            while(capacity < initialCapacity){
                capacity <<= 1;
            }
            this.elementData = new Object[capacity];
        }
        public MyArrayList(){
            this(10);
        }
        
        public int length(){
            return size;
        }
        
        @SuppressWarnings("unchecked")
        public T get(int index) {
            checkIndex(index, size - 1);
            return (T) elementData[index];
        }
        
        public int indexOf(T element) {
            
            if(element == null){
                for (int i = 0; i < size; i++)
                    if (elementData[i]==null)
                        return i;
            }else{
                for (int i = 0; i < size; i++)
                    if (element.equals(elementData[i]))
                        return i;
            }
            return -1;
            
        }
        
        public void insert (int index, T element ){
            checkIndex(index, size);
            ensureCapacity(size + 1);
            System.arraycopy(elementData, index, elementData, index + 1, size - index);
            elementData[index] = element;
            size++;
        }
        
        public void add(T element) {
            insert(size, element);
        }
        
        private void ensureCapacity(int minCapacity) {
            if(capacity < minCapacity){
                while(capacity < minCapacity){
                    capacity <<= 1;
                }
                elementData = Arrays.copyOf(elementData, capacity);
            }
            
        }
        
        @SuppressWarnings("unchecked")
        public T delete (int index ){
            checkIndex(index, size - 1);
            T oldValue = (T) elementData[index];
            int numMoved = size - index -1;
            if(numMoved > 0)
                System.arraycopy(elementData, index + 1, elementData, index, numMoved);
            elementData[--size] = null;
            return oldValue;
        }
        
        public T remove(){
             return delete(size - 1);
        }
        
        public boolean isEmpty(){
            return size == 0;
        }
        
        public void clear(){
            Arrays.fill(elementData, null);
            size = 0;
        }
        
        @Override
        public String toString() {
            if(size == 0) return "[]";
            StringBuilder sb = new StringBuilder("[");
            for(int i = 0; i < size; i++)
                sb.append(elementData[i]+", ");
            int len = sb.length();
            return sb.delete(len - 2, len).append("]").toString();
        }
        
        private void checkIndex(int index, int max) {
            if(index > max || index < 0 )
                throw new IndexOutOfBoundsException("index"+index);
        }
    }
    

    最后,完成表的实现我们可以写一个测试方法运行验证写的是否正确。下面的是一个简单的测试,没有对所有方面验证:

    package com.nonefly.list;
    /**
     * 线性表测试
     * @author nonefly
     */
    public class Test {
        public static void main(String[] args) {
            MyList<String> list = null;
            
            list = new MyArrayList<String>();//顺序表测试
            //list = new MyLinkList<String>();//链表测试
    
            //增
            list.add("hello");
            list.add("world");
            list.add("nonefly");
            //改
            list.insert(2, null);//注意验证元素null存取
            list.insert(3, "I am");
            System.out.println(list);
            //删
            list.delete(1);
            System.out.println(list);
            //查询
            System.out.println("表长度为:"+list.length());//长度
            System.out.println("null元素所在索引:"+list.indexOf(null));//输出1
            System.out.println("'world'元素所在索引:"+list.indexOf("world"));//已删除,输出-1,表示错误
        }
        
    }
    

    测试结果如下:
    运行结果

    所有文章未特殊说明均属原创,有误之处欢迎提出,转载随意,您喜欢就好,但请注明,谢谢!
  • 相关阅读:
    字符串转换相关
    Xcode新功能
    CocoaPods使用详情及版本未更新安装报错
    Cannot create __weak reference in file using manual refs Xcode 7.3
    UIButton实现左文字右图片
    iOS App 上架流程-版本更新注意事项
    iOS App 上架流程-新版本1.0上架
    NSNotification的用法
    NScfBool转bool类型
    百度地图 移动坐标显示该坐标周围对应的信息
  • 原文地址:https://www.cnblogs.com/nonefly/p/4603328.html
Copyright © 2011-2022 走看看