什么是数据结构?
线性表
数组
动态数组设计
项目结构
代码实现
CybArrayList.java
package com.cyb; /** * 自定义ArrayList数组 * * @author chenyanbin * */ public class CybArrayList { /** * 元素的数量 */ private int size; /** * 所有元素 */ private int[] elements; private static final int DEFAULT_CAPACITY = 100; private static final int ELEMENT_NOT_FOUND = -1; public CybArrayList() { this(DEFAULT_CAPACITY); } public CybArrayList(int capacity) { capacity = (capacity < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capacity; elements = new int[capacity]; } /** * 元素的个数 * * @return */ public int size() { return size; } /** * 是否为空 * * @return */ public boolean isEmpty() { return size == 0; } /** * 是否包含某个元素 * * @param element 元素 * @return */ public boolean contains(int element) { return indexOf(element) != ELEMENT_NOT_FOUND; } /** * 添加元素到最后面 * * @param element */ public void add(int element) { add(size, element); } /** * 往index位置添加元素 * * @param index 索引下标 * @param element 元素 */ public void add(int index, int element) { rangeCheckForAdd(index); ensureCapacity(size + 1); for (int i = size - 1; i >= index; i--) { elements[i + 1] = elements[i]; } elements[index] = element; size++; } /** * 返回index位置对应的元素 * * @param index 索引下标 * @return */ public int get(int index) { rangeCheck(index); return elements[index]; } /** * 设置index位置的元素 * * @param index 索引下标 * @param element 元素 * @return 原来的元素 */ public int set(int index, int element) { rangeCheck(index); int oldElement = elements[index]; elements[index] = element; return oldElement; } /** * 删除index位置对应的元素 * * @param index 索引下标 * @return 删除的元素值 */ public int remove(int index) { rangeCheck(index); int result = elements[index]; for (int i = index + 1; i <= size - 1; i++) { elements[i - 1] = elements[i]; } size--; return result; } /** * 查看元素的位置 * * @param element 元素 * @return */ public int indexOf(int element) { for (int i = 0; i < size; i++) { if (elements[i] == element) return i; } return ELEMENT_NOT_FOUND; } /** * 清除所有元素 */ public void clear() { size = 0; } @Override public String toString() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("size=").append(size).append(",["); for (int i = 0; i < size; i++) { // 方式一(推荐) if (i > 0) { stringBuilder.append(","); } stringBuilder.append(elements[i]); // 方式二(不推荐) // if (i!=size-1) { // stringBuilder.append(","); // } } stringBuilder.append("]"); return stringBuilder.toString(); } private void outOfBounds(int index) { throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size); } /** * 范围检测 * * @param index 索引下标 */ private void rangeCheck(int index) { if (index < 0 || index >= size) { outOfBounds(index); } } /** * 范围检测 * * @param index 索引下标 */ private void rangeCheckForAdd(int index) { if (index < 0 || index > size) { outOfBounds(index); } } /** * 保证要有capacity的容量 * * @param capacity 容量 */ private void ensureCapacity(int capacity) { int oldCapacity = elements.length; if (oldCapacity >= capacity) return; // 新容量为旧容量的1.5倍 int newCapacity = oldCapacity + (oldCapacity >> 1); int[] newElements = new int[newCapacity]; for (int i = 0; i < size; i++) { newElements[i] = elements[i]; } elements = newElements; System.out.print("容量从"+oldCapacity+"扩展为"+newCapacity+"\n"); } }
泛型
使用泛型技术可以让动态数组更加通用,可以存放任何数据类型。
CybArrayList.java(泛型)
package com.cyb; /** * 自定义ArrayList数组 * * @author chenyanbin * */ public class CybArrayList<E> { /** * 元素的数量 */ private int size; /** * 所有元素 */ private E[] elements; private static final int DEFAULT_CAPACITY = 100; private static final int ELEMENT_NOT_FOUND = -1; public CybArrayList() { this(DEFAULT_CAPACITY); } @SuppressWarnings("unchecked") public CybArrayList(int capacity) { capacity = (capacity < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capacity; elements = (E[]) new Object[capacity]; } /** * 元素的个数 * * @return */ public int size() { return size; } /** * 是否为空 * * @return */ public boolean isEmpty() { return size == 0; } /** * 是否包含某个元素 * * @param element 元素 * @return */ public boolean contains(E element) { return indexOf(element) != ELEMENT_NOT_FOUND; } /** * 添加元素到最后面 * * @param element */ public void add(E element) { add(size, element); } /** * 往index位置添加元素 * * @param index 索引下标 * @param element 元素 */ public void add(int index, E element) { rangeCheckForAdd(index); ensureCapacity(size + 1); for (int i = size - 1; i >= index; i--) { elements[i + 1] = elements[i]; } elements[index] = element; size++; } /** * 返回index位置对应的元素 * * @param index 索引下标 * @return */ public E get(int index) { rangeCheck(index); return elements[index]; } /** * 设置index位置的元素 * * @param index 索引下标 * @param element 元素 * @return 原来的元素 */ public E set(int index, E element) { rangeCheck(index); E oldElement = elements[index]; elements[index] = element; return oldElement; } /** * 删除index位置对应的元素 * * @param index 索引下标 * @return 删除的元素值 */ public E remove(int index) { rangeCheck(index); E result = elements[index]; for (int i = index + 1; i <= size - 1; i++) { elements[i - 1] = elements[i]; } elements[--size] = null; return result; } /** * 查看元素的位置 * * @param element 元素 * @return */ @SuppressWarnings("null") public int indexOf(E element) { if (element == null) { for (int i = 0; i < size; i++) { if (elements[i] == null) return i; } } else { for (int i = 0; i < size; i++) { if (element.equals(elements[i])) return i; } } return ELEMENT_NOT_FOUND; } /** * 清除所有元素 */ public void clear() { for (int i = 0; i < size; i++) { elements[i] = null; } size = 0; } @Override public String toString() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("size=").append(size).append(",["); for (int i = 0; i < size; i++) { // 方式一(推荐) if (i > 0) { stringBuilder.append(","); } stringBuilder.append(elements[i]); // 方式二(不推荐) // if (i!=size-1) { // stringBuilder.append(","); // } } stringBuilder.append("]"); return stringBuilder.toString(); } private void outOfBounds(int index) { throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size); } /** * 范围检测 * * @param index 索引下标 */ private void rangeCheck(int index) { if (index < 0 || index >= size) { outOfBounds(index); } } /** * 范围检测 * * @param index 索引下标 */ private void rangeCheckForAdd(int index) { if (index < 0 || index > size) { outOfBounds(index); } } /** * 保证要有capacity的容量 * * @param capacity 容量 */ private void ensureCapacity(int capacity) { int oldCapacity = elements.length; if (oldCapacity >= capacity) return; // 新容量为旧容量的1.5倍 int newCapacity = oldCapacity + (oldCapacity >> 1); @SuppressWarnings("unchecked") E[] newElements = (E[]) new Object[newCapacity]; for (int i = 0; i < size; i++) { newElements[i] = elements[i]; } elements = newElements; System.out.print("容量从" + oldCapacity + "扩展为" + newCapacity + "\n"); } }