目录
一,动态数组
1.数组属性:
1.1生成一个动态数组并设置大小:
//定义属性
//elementData就是具体存储元素的数组
private int[] elementData;
//当前动态数组中存储了几个元素
private int size;
public DynamicArray(){
this.elementData = new int[10];
}
2.数组的增删改查(CRUD)
2.1表头,表尾和表中插入元素:
(1)表头插入:将数组中的每个元素向后移一位,将表头位置空出再插入。
(2)表尾插入:只需在表尾插入即可。
(3)表中插入:将要插入索引的元素到最后一个元素都向后移一位,空出要插入索引位置再插入。
注意:上述插入方式都要判断该数组空间是否够用,若不够用则需要扩容。
/**
* 在数组头部添加元素
* @param data
*/
public void addFirst(int data){
//此时内部小数组已满,需要扩容
if (size == elementData.length){
grow();
}
for (int i = size - 1; i >= 0; i--) {
elementData[i + 1] = elementData[i];
}
//此时index = 0;数组头部空出来
elementData[0] = data;
size++;
}
/**
*在数组的尾部添加元素
* @param data
*/
public void addLast(int data){
if (size == elementData.length){
grow();
}
elementData[size] = data;
size++;
}
/**
* 在数组的索引处添加元素
* @param index
* @param data
*/
public void addIndex(int index,int data){
//index在插入时,特殊场景
//index=0 ,是头插
//index = size, 是尾插
//先判断边界条件index是否合法
if (index < 0 || index > size){
System.out.println("index非法,无法进行插入");
return;
}
//判断当前数组是否已满
if (size == elementData.length){
grow();
}
//数据插入
if (index == 0){
addFirst(data);
}
if (index == size){
addLast(data);
}else {
//在数组的中间位置插入
for (int i = size - 1; i >= index; i--) {
elementData[i + 1] = elementData[i];
}
//此时index位置空出
elementData[index] = data;
size++;
}
2.2.改数组中的某个元素:
/**
* 将指定位置index的元素修改为新值newData
* @param index
* @param newData
* @return修改前的元素
*/
public int set(int index,int newData){
if (rangeCheck(index)){
int oldValue = elementData[index];
elementData[index] = newData;
return oldValue;
}
return -1;
}
/**
* 校验当前传入的index是否合法
* @param index
* @return
*/
private boolean rangeCheck(int index){
if (index < 0 || index > size){
//错误输出
System.err.println("当前index非法,index >= 0 && index < size");
return false;
}
return true;
}
2.3.查找数组中的某个元素:
**
* 查找数组中是否含有某个元素
* @param data
* @return
*/
public boolean contains(int data){
for (int i = 0; i < size; i++) {
if (elementData[i] == data){
return true;
}
}
return false;
}
2.4数组元素的删除
/**
* 按索引删除
* @param index
*/
public void remove(int index){
if (rangeCheck(index)){
//从index位置开始,将之后的元素统一向前移一位
for (int i = index; i < size; i++) {
elementData[i] = elementData[i -1];
}
size--;
}
}
/**
* 按值删除
* @param value
*/
public void removeValue(int value){
for (int i = 0; i < s; i++) {
if (elementData[i] == value){
remove(i);
}
}
}
3.数组的扩容:
//内部扩容法
private void grow(){
int oldLength = elementData.length;
int newLength = oldLength << 1;
//将原数组搬移到新数组
elementData = Arrays.copyOf(elementData,newLength);
}
6.数组的序列化:
/**
* 将当前动态数组转换为字符串
* @return
*/
public String toString(){
//每个元素都在elementData数组中存储
String ret = "[";
for (int i = 0; i < size; i++) {
ret += elementData[i];
if (i != size - 1){
ret += ",";
}
}
ret += "]";
return ret;
}
4.数组的大小
//取得当前数组长度
public int getSize(){
return size;
}