以下内容会同步更新到我的公众号:melred编程
前面我们已经写了菜单类和存储结构,现在就可以进行增删改查的操作了
1、添加(按顺序)
我们已经有了一个数组,现在,我们要对它进行添加,其实就是给数组元素赋值,但是如果让每个元素都可以被添加到呢?
我们可以用一个指针(其实是一个整型变量,它表示一个数组下标)来定位数组元素
private static int n = 0;//数组下标,每次添加之后就+1(后移)
每次当我们添加一个数据后,就让它后移(自增),这样一来每次添加的位置都不一样,而且可以顺序添加。
//每次增加后
n++;
但是,这里又有一个问题,如果n超过了数组的下标范围,就会报空指针异常(NotPointException),又该如何?
首先,我们加入一个if判断,分别处理n在下标范围内和不在下标范围内的情况:
1,当在下标范围内的时候:就给对应位置的元素赋值(方法参数(int b)就是传进来要添加的值),然后让n后移,下一次就在下一个位置添加
//增加的函数
private static void add(int b){
//自增长添加
if (n!=a.length) {
a[n] = b;
n++;
}
2,当不在范围内时:就把n归零,从头开始赋值,但是再次在同一个位置添加,会覆盖原来的数据
else {
n = 0;
System.out.println("n已经归零");
}
System.out.println("下一次添加位置(非下标):"+(n+1));
}
![](https://img-blog.csdnimg.cn/4f7a4968f4854525b4003b6ed824766a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rWF56m66aOe6bif,size_20,color_FFFFFF,t_70,g_se,x_16)
更好的办法:我们可以不用if,直接让n和数组长度取模,这样就算超过数组的长度,也会循环添加(因为 n对数组长度 取模 就相当于 获取它超出数组长度多少,取模就是取余数)
2,添加(到自定义的位置)
添加到自定义位置只需要多传一个参数(表示自定义的下标),然后让数组对应位置被改变就行
private static void add(int b,int c){
//自定义添加位置
a[c] = b;
System.out.println("添加的位置(非下标):"+(c+1));
}
你可能会发现这两个方法都是私有,这是为了让把它们整合到一个方法里,这样别的类就不用考虑到底调用哪个,而只需要根据用户输入,在整合的方法里选择调用
//解耦合,把逻辑封装在功能类
public static void add(Scanner scanner){
System.out.println("输入1,按默认添加位置;输入2,自定义添加位置");
int n = scanner.nextInt();
if (n == 2) {
System.out.println("输入要添加的《数字》和《位置(非下标)》,每输入一个按一次回车");
add.add(scanner.nextInt(), scanner.nextInt() - 1);
} else if (n == 1) {
System.out.println("输入要添加的数字");
add.add(scanner.nextInt());
}
}
}
这里有一个细节,我们把一个scanner类传入,让它来接收用户输入,并且可以控制我们的选项(选择调用哪个添加方法)、还可以传入要修改的数值,最重要的是,一般可能会把这个scanner写在菜单类,但是这样就会高耦合,而且菜单类会变得复杂,代码可读性差
最后只要在菜单类调用添加类的整合方法就行了
public static void menu() throws Exception{
setArr();
boolean flag = true;
int choice = -1;
while (flag) {
System.out.println("---------------菜单--------------");
System.out.println("输入数字,选择数字进行操作");
System.out.println("1,增加");
System.out.println("2,删除");
System.out.println("3,修改");
System.out.println("4,查找");
System.out.println("5,退出");
Scanner scanner = new Scanner(System.in);
choice = scanner.nextInt();
switch (choice) {
case 1:
circle(scanner, 1);
break;
case 2:
circle(scanner, 2);
break;
case 3:
circle(scanner, 3);
break;
case 4:
circle(scanner, 4);
break;
case 5:
System.out.println("已经退出程序");
flag = false;
break;
}
}
}
private static void circle(Scanner scanner, int choice) {
//把循环执行的逻辑防在菜单类,各司其职
boolean controller = true;
while (controller) {
switch (choice) {
case 1:
add.add(scanner);
break;
case 2:
break;
case 3:
break;
case 4:
break;
}
System.out.println("当前的数据:"+Arrays.toString(arrays.getArr()));
System.out.println("输入false退出,输入true继续");
controller = scanner.nextBoolean();
}
}