什麼是數據結構? 線性表 數組 動態數組設計 項目結構 代碼實現 CybArrayList.java package com.cyb; /** * 自定義ArrayList數組 * * @author chenyanbin * */ public class CybArrayList { /** * ...
什麼是數據結構?
線性表
數組
動態數組設計
項目結構
代碼實現
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; i > index; i--) { elements[i] = elements[i - 1]; } 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; i++) { elements[i - 1] = elements[i]; } elements[--size] = null; return result; } /** * 刪除對象 * * @param element 對象 */ public void remove(E element) { remove(indexOf(element)); } /** * 查看元素的位置 * * @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"); } }