接口实现
add
在数组的末尾添加一个元素:void addLast(E e)
在数组的第一个位置添加一个元素:addFirst(E e)
在指定位置添加一个元素:add(int index, E e)
delete
从数组中删除index位置的元素, 返回删除的元素:E remove(int index)
从数组中删除第一个元素, 返回删除的元素:E removeFirst()
从数组中删除最后一个元素, 返回删除的元素: E removeLast()
从数组中删除单个元素e,删除成功则返回true,否则返回false:boolean removeElement(E e)
从数组中批量删除元素e,删除成功则返回true,否则返回false:boolean removeAllElement(E e)
删除所有重复元素
update
修改index索引位置的元素为e:void set(int index,E e)
get
获取数组中元素的个数:int getSize()
获取数组的容量:int getCapacity()
查找数组中是否有元素e:boolean contains(E e)
查找数组中元素e所在的索引, 如果不存在元素e, 则返回-1:int find(E e)
查找数组中所有元素e所在的索引, 如果不存在元素e, 则返回一个空的数组:int[] findAll(E e)
verification
验证数组是否为空:boolean isEmpty()
other
扩容/压缩数组:void resize(int newCapacity)
源码
gitee:https://gitee.com/xianxian86/post-packaging_array
/** * @Version 1.0 * @Author: 小贤 * @Date:2021/2/16 * @Content: 二次封装数组 */
public class Array<E> {
private E[] data; //数组
private int size; //元素个数
/** * 构造数组,默认容量为10 */
public Array(){
this(10);
}
/** * 传入数组的capacity(容量),构造数组 * @param capacity */
public Array(int capacity){
data = (E[])new Object[capacity];
size = 0; //指定元素的个数为0
}
/** * 获取数组中元素的个数 * @return */
public int getSize(){
return size;
}
/** * 获取数组的容量 * @return */
public int getCapacity(){
return data.length;
}
/** * 在数组的末尾添加一个元素 * @param e */
public void addLast(E e){
add(size,e);
}
/** * 在数组的第一个位置添加一个元素 * @param e */
public void addFirst(E e){
add(0,e);
}
/** * 在指定位置添加一个元素 * @param index * @param e */
public void add(int index, E e){
if(index < 0 || index > size)
throw new IllegalArgumentException("Add failed. Array is full");
if(size == data.length){
resize(2 * data.length);
}
for(int i = size -1 ; i >= index; i--)
data[i+1] = data[i]; // 移动元素的位置
data[index] = e; // 赋值
size ++; // 元素个数+1
}
/** * 返回数组是否为空 */
public boolean isEmpty(){
return size == 0;
}
/** * 获取index索引位置的元素 * @param index * @return */
public E get(int index){
if(index < 0 || index >= size){
throw new IllegalArgumentException("Get failed. Index is full");
}
return data[index];
}
/** * 修改index索引位置的元素为e * @param index * @param e */
public void set(int index,E e){
data[index] = e;
}
/** * 查找数组中是否有元素e * @param e * @return */
public boolean contains(E e){
for(int i = 0 ; i < size ; i++){
if(data[i].equals(e))
return true;
}
return false;
}
/** * 查找数组中元素e所在的索引, 如果不存在元素e, 则返回-1 * @param e * @return */
public int find(E e){
for (int i = 0 ; i < size ; i++){
if(data[i].equals(e)){
return i;
}
}
return -1;
}
/** * 查找数组中所有元素e所在的索引, 如果不存在元素e, 则返回一个空的数组 * @param e * @return */
//查找数组中所有元素e所在的索引, 如果不存在元素e, 则返回一个空的数组
public int[] findAll(E e){
StringBuilder index = new StringBuilder();
for (int i = 0 ; i < size ; i++){
if (data[i].equals(e)) {
index.append(i);
if (i != size-1){
index.append(",");
}
}
}
if(index.length() == 0){
return new int[0];
}
String[] splitIndex = index.toString().split(",");
int[] resultIndex = new int[splitIndex.length];
for (int i = 0; i < splitIndex.length; i++) {
resultIndex[i] = Integer.parseInt(splitIndex[i]);
}
return resultIndex;
}
/** * 从数组中删除index位置的元素, 返回删除的元素 * @param index * @return */
public E remove(int index){
if(index < 0 || index >= size)
throw new IllegalArgumentException("Remove failed. Index is illegal");
E ret = data[index];
for(int i = index+1 ; i<size ; i++)
data[i-1] = data[i];
size--;
data[size] = null;
if(size == data.length / 4 && data.length / 2 != 0)
resize(data.length / 2);
return ret;
}
/** * 从数组中删除第一个元素, 返回删除的元素 * @return */
public E removeFirst(){
return remove(0);
}
/** * 从数组中删除最后一个元素, 返回删除的元素 * @return */
public E removeLast(){
return remove(size - 1);
}
/** * 从数组中删除单个元素e,删除成功则返回true,否则返回false * @param e * @return */
public boolean removeElement(E e){
int index = find(e);
if(index != -1){
remove(index);
return true;
}
return false;
}
/** * 从数组中批量删除元素e,删除成功则返回true,否则返回false * @param e * @return */
public boolean removeAllElement(E e){
int index = find(e);
boolean flag = true;
while(index != -1){
flag = false;
remove(index);
index = find(e);
}
if (!flag) {
return true;
}
return false;
}
@Override
public String toString(){
StringBuilder res = new StringBuilder();
res.append(String.format("Array: size = %d , capacity = %d\n", size, data.length));
res.append('[');
for(int i = 0 ; i < size ; i ++){
res.append(data[i]);
if(i != size - 1)
res.append(", ");
}
res.append(']');
return res.toString();
}
/** * 扩容/压缩数组 * @param newCapacity */
private void resize(int newCapacity){
E[] newData = (E[]) new Object[newCapacity];
for(int i = 0 ; i < size ; i++){
newData[i] = data[i];
}
data = newData;
}
}
代码需要修改的地方还有很多,希望大家能够给我一些建议!