动态数组

动态数组什么是数据结构?线性表数组动态数组设计项目结构代码实现CybArrayList.javapackagecom.cyb;/***自定义ArrayList数组**@author

大家好,又见面了,我是你们的朋友全栈君。

什么是数据结构?

<span role="heading" aria-level="2">动态数组

 

线性表

<span role="heading" aria-level="2">动态数组

 

数组

<span role="heading" aria-level="2">动态数组

 

动态数组设计

<span role="heading" aria-level="2">动态数组

 项目结构

<span role="heading" aria-level="2">动态数组

代码实现

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"); } }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/155195.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号