好的又是我我来了,本菜狗有为csdn添加一烂博客了
今天依旧是为蓝桥杯落泪的一天,朋友们你们有信心嘛,反正我没有
依然是:本文运行环境:JAVA
本文使用编辑器:IDEA
怎么在数组中增加元素?
- 我们先从最简单的一种方法说起:从末尾插入
那这样写个对应的方法也不是很难
public void addLast(int e){
//传入相应的元素
//add(size,e);
data[size]=e;
size++;
}
- 单单从数组后面加入元素是不够我们使用的,我们还需要在中间插入元素
假设我们要在索引为1的位置插入一个数据,要怎么做呢
- 第一步,讲要插入这个元素位置以及后面的元素都向后挪
- 第二步,插入待插入的数据
- 第三步,维护数组(即size++)
综上所述我们可以去写一个方法
- 第一步,讲要插入这个元素位置以及后面的元素都向后挪
public void add(int index,int e){
//当数据溢出的适合
if(size==data.length){
throw new IllegalArgumentException("ADDLAST FAUILED");
}
//不是紧密联系的
if(index<0 || index>size){
throw new IllegalArgumentException("ADDLAST FAUILED");
}
for(int i=size-1;i>=index;i--){
data[i+1]=data[i];
}
data[index]=e;
size++;
}
这样的方法是否和我们之前的方式有所重合呢,显然是有的,虽然向后插入和中间插入省去了挪的步骤,但其他的步骤是重合的。
我们就可以根据这个重复的步骤进行代码复用
public void addLast(int e){
//传入相应的元素
add(size,e);
//data[size]=e;
//size++;
}
public void addFirst(int e){
add(0,e);
}
这里可以看到,不管是头插还是尾插,都可以使用这样的代码,头插就是当index=0的时候,所有的元素向后挪。而尾插则跳过了循环条件检查,直接进入赋值和维护数组的步骤。这么一看数组的增加数字,是不是很简单。
-
测试
我这边重写了toString方法,这里不涉及本课内容所以不做过多演示。
package com.company;
public class Main {
public static void main(String[] args) {
// write your code here
Array arr = new Array(20);
for (int i = 0; i < 10; i++) {
arr.addLast(i);
}
System.out.println(arr);
arr.add(1, 100);
System.out.println(arr);
arr.addFirst(-1);
System.out.println(arr);
}
}
打印结果:
那获取元素和修改元素不是一样的道理吗?
根据下标找到对应的元素,插入待修改的数据/找到该元素
//获取index索引位置的元素
int get(int index){
if(index<0 || index>size){
throw new IllegalArgumentException("ADDLAST FAUILED");
}
return data[index];
}
//获取index索引位置的元素,直接插入,不用挪位置
void set(int index,int e){
if(index<0 || index>size){
throw new IllegalArgumentException("ADDLAST FAUILED");
}
data[index] = e;
}
- 测试
package com.company;
public class Main {
public static void main(String[] args) {
// write your code here
Array arr = new Array(20);
for (int i = 0; i < 10; i++) {
arr.addLast(i);
}
//System.out.println(arr);
arr.add(1, 100);
//System.out.println(arr);
arr.addFirst(-1);
//System.out.println(arr);
System.out.println( arr.get(1));
arr.set(10,1000000);
System.out.println(arr);
}
}
- 测试结果
查找以及包含
写两个方法,一个负责查找数组中是否有元素,一个查找如果有这个元素则返回下标
两个方法的内核是一样的,只不过一个返回布尔类型的值,一个返回int类型的值
//查找数组中是否由元素e
public boolean contain(int e){
for(int i=0;i<size;i++){
if(data[i] == e){
return true;
}
}
return false;
}
//通过元素来查找数组的下标,如果存在返回下标,否则返回-1
public int Find(int e){
for(int i=0;i<size;i++){
if(data[i] == e){
return i;
}
}
return -1;
}
删除
删除其实和增加很像,都是数组中元素的移动
*其实这边我更倾向于理解为运一个为null的元素,我在后面的图会更新的
由此可以看见,我们的删除其实就是添加的逆过程,只不过添加是向后移动元素,删除是向前挪动元素来腾出空间。
最后不要忘记维护数组:size–;
- 代码文件
//删除
public int remove(int index){
if(size==data.length){
throw new IllegalArgumentException("ADDLAST FAUILED");
}
//纪念一下这个牺牲的兄弟
int ret = data[index];
//集体向前移
for(int i=index+1;i<size;i++){
data[i-1]=data[i];
}
//维护一下
size--;
return ret;
}
public int RemoveFirst(){
return remove(0);
}
public int RemoveLast(){
return remove(size-1);
}
public void RemoveElement(int e){
//先去找这个元素
int index = Find(e);
//如果找到了,就把他删了
if(index != -1){
remove(index);
}
}
你们可以看到,这个复用的过程和增加是很像的。
- 测试
package com.company;
public class Main {
public static void main(String[] args) {
// write your code here
Array arr = new Array(20);
for (int i = 0; i < 10; i++) {
arr.addLast(i);
}
//System.out.println(arr);
arr.add(1, 100);
//System.out.println(arr);
arr.addFirst(-1);
//System.out.println(arr);
System.out.println( arr.get(1));
arr.set(10,1000000);
System.out.println(arr);
arr.remove(2);
System.out.println(arr);
}
}
运行结果:
可以看到变化了把。
总结
事上无难事,就怕太无聊没脑子又不敢去做(没错没错骂的就是我这个菜狗)
大家一起加油
课后测试
- 数组怎么进行插入元素,具体的步骤是什么?代码怎么实现?
- 怎么get和set元素?
- 怎么查找是否包含这个元素?
- 怎么删除这个元素?具体的步骤是什么?代码怎么实现?