A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 苟苟 中级黑马   /  2015-5-1 10:18  /  613 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

学习完java集合容器.模仿一个简单的ArrayList.
模仿的简单的ArrayList支持增删查, 并且具有自动扩大容量的功能,增加遍历.  
接口文件如下:
  1. /**
  2. * <p>Title: ILinearList.java</p>
  3. * <p>Description: 线性表抽象接口</p>
  4. * <p>Copyright: Copyright (c) 2015</p>
  5. * @author possible
  6. * @version 1.0
  7. */
  8. package com.dt.linearlist;

  9. public interface ILinearList<T> {
  10. //        /**
  11. //         * 初始化线性表
  12. //         *
  13. //         * @return 返回线性表引用
  14. //         */
  15. //        public T initList();

  16.         /**
  17.          * 删除线性表
  18.          *
  19.          * @return 返回true 销毁成功 false失败
  20.          */
  21.         public void destoryList();

  22.         /**
  23.          * 判断线性表是否为空
  24.          *
  25.          * @return true 链表为空. false 链表不为空
  26.          */
  27.         public boolean isEmpty();

  28.         /**
  29.          * 线性表长度
  30.          *
  31.          * @return 链表长度
  32.          */
  33.         public int length();

  34.         /**
  35.          * 获取指定索引线性表结点
  36.          *
  37.          * @param index
  38.          *            获取index位置的元素
  39.          * @return 返回元素 T
  40.          */
  41.         public T get(int index);

  42.         /**
  43.          * 在指定位置插入元素
  44.          *
  45.          * @param i
  46.          *            插入位置的索引
  47.          * @param t
  48.          *            插入的元素
  49.          * @return true 插入成功, false 插入失败
  50.          */
  51.         public boolean add(int index, T t);

  52.         /**
  53.          * 删除指定索引的元素
  54.          *
  55.          * @param i
  56.          *            删除指定位置的元素
  57.          * @return true 删除成功; false 删除失败
  58.          */
  59.         public T delete(int index);

  60.         /**
  61.          * 线性表遍历
  62.          *
  63.          * @return 返回遍历结果
  64.          */
  65.         public String traverse();

  66.         /**
  67.          * 插入元素结点.
  68.          *
  69.          * @param t
  70.          *            插入结点
  71.          * @return true 插入成功 ; false 插入失败
  72.          */
  73.         public boolean add(T t);
  74. }
复制代码


对应模仿的简单ArrayList如下:
  1. /**
  2. * <p>Title: ArrayLinearList.java</p>
  3. * <p>Description:模仿ArrayList</p>
  4. * <p>Copyright: Copyright (c) 2015</p>
  5. * @author possible
  6. * @version 1.0
  7. */
  8. package com.dt.linearlist;

  9. import java.util.Arrays;

  10. /**
  11. * @author possible
  12. *
  13. */
  14. public class ArrayLinearList<T> implements ILinearList<T> {
  15.         /**
  16.          * 扩大容量的加载因子
  17.          */
  18.         private static final float LOADER_FACTOR = 0.8f;
  19.         /**
  20.          * 初始化容量
  21.          */
  22.         private static final int INITITAL_CAPACITY = 3;

  23.         /**
  24.          * 顺序表中真实存放的元素的个数
  25.          */
  26.         private int length;
  27.         /**
  28.          * 容量
  29.          */
  30.         private int capacity;
  31.         private Object[] elements;

  32.         public ArrayLinearList() {
  33.                 this(INITITAL_CAPACITY);
  34.         }

  35.         public ArrayLinearList(int inititalCapacity) {
  36.                 elements = new Object[inititalCapacity];
  37.                 this.capacity = inititalCapacity;
  38.         }

  39.         @Override
  40.         public void destoryList() {
  41.                 for (int i = 0, len = elements.length; i < len; i++) {
  42.                         elements[i] = null;
  43.                 }
  44.                 length = 0;
  45.         }

  46.         @Override
  47.         public boolean isEmpty() {
  48.                 return length == 0;
  49.         }

  50.         @Override
  51.         public int length() {
  52.                 System.out.println("length = "+length+"   capacity = "+capacity);
  53.                 return length;
  54.         }

  55.         @SuppressWarnings("unchecked")
  56.         @Override
  57.         public T get(int index) {
  58.                 if (!checkBounds(index)) {
  59.                         throw new ArrayIndexOutOfBoundsException(checkBoundsMsg(index));
  60.                 }
  61.                 return (T) elements[index];
  62.         }

  63.         @Override
  64.         public boolean add(int index, T t) {
  65.                 if (!checkBounds(index)) {
  66.                         throw new ArrayIndexOutOfBoundsException(checkBoundsMsg(index));
  67.                 }
  68.                
  69.                 if (isExtendCapacity()) {
  70.                         extendCapacity();
  71.                 }
  72.                 System.arraycopy(elements, index, elements, index+1, length-index+1);
  73.                 elements[index] = t;
  74.                 length ++;
  75.                 return true;
  76.         }
  77.         @Override
  78.         public T delete(int index) {
  79.                 if (!checkBounds(index)) {
  80.                         throw new ArrayIndexOutOfBoundsException(checkBoundsMsg(index));
  81.                 }
  82.                 @SuppressWarnings("unchecked")
  83.                 T t = (T) elements[index];
  84.                 System.arraycopy(elements, index+1, elements, index, length-index-1);
  85.                 length--;
  86.                 return t;
  87.         }

  88.         @Override
  89.         public String traverse() {
  90.                 StringBuffer sb = new StringBuffer();
  91.                 sb.append("开始遍历顺序表");
  92.                 sb.append("\n");
  93.                 for (int i = 0, len = length; i < len; i++) {
  94.                         if(elements[i] == null){
  95.                                 break;
  96.                         }
  97.                         sb.append(elements[i].toString());
  98.                         sb.append("\n");
  99.                 }
  100.                 sb.append("结束遍历顺序表");
  101.                 System.out.println(sb.toString());
  102.                 return sb.toString();
  103.         }

  104.         @Override
  105.         public boolean add(T t) {
  106.                 if (isExtendCapacity()) {
  107.                         extendCapacity();
  108.                 }

  109.                 elements[length++] = t;
  110.                 return true;
  111.         }

  112.         private String checkBoundsMsg(int index) {
  113.                 if (index >= length) {
  114.                         return "下标越界   " + " length: " + length + " index: " + index;
  115.                 }
  116.                 return null;
  117.         }

  118.         /**
  119.          * 检查指定的索引是否越界
  120.          *
  121.          * @param index
  122.          * @return
  123.          */
  124.         private boolean checkBounds(int index) {
  125.                 return index >= 0 && index < length;
  126.         }

  127.         /**
  128.          * 判断是否需要扩大容量
  129.          */
  130.         private boolean isExtendCapacity() {
  131.                 if (length > capacity * LOADER_FACTOR) {
  132.                         return true;
  133.                 }
  134.                 return false;
  135.         }

  136.         /**
  137.          * 扩展容量
  138.          */
  139.         private void extendCapacity() {
  140.                 System.out.println("扩大容量");
  141.                 int newLength = capacity * 2;
  142.                 elements = Arrays.copyOf(elements, newLength);
  143.                 capacity = newLength;
  144.         }

  145. }
复制代码

3 个回复

倒序浏览
大神,学习了
回复 使用道具 举报

哈哈,谢谢. 很简单的模仿了一下.
回复 使用道具 举报
学习了~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马