目录
定义一个类,对数组中的数据进行管理,如下
1、插入数据
代码如下
/**
* 实现数据对数组的插入
*
* @return
*/
public int[] insertData() {
int[] a = new int[10];
// 为了后面单独插入数据作准备,所以只插入9个数据
Scanner sc = new Scanner(System.in);
for (int i = 0; i < a.length - 1; i++) {
System.out.println("请输入第" + (i + 1) + "个数据:");
// 使用try和catch捕捉异常
try {
a[i] = sc.nextInt();
} catch (InputMismatchException e) {
System.out.println("你的输入有误,请重新输入!");
sc.next();
i--;
}
}
return a;
}
这里的问题目前的问题就是没有办法实现动态的数组,所以看起来有一点点尴尬
这里要注意的一个问题就是在输入数组元素的时候,会出现类型不匹配的问题,就会报出异常,所以要使用到try-catch语句,对异常进行捕捉
在进行异常捕捉之后,要对异常进行处理,处理的语句放在catch中,这里还要注意一个问题,就是在处理的时候,要使用语句
sc.next();
就是这一条语句对你输入错误的不匹配的数据进行捕捉,否则就会出现下面这样的情况,如下图,刚开始接触,可能感觉莫名其妙
所以要记住写上一句sc.next();用来接受你输错的数据,我猜测啊!如果不写这样一句的话,那么之前输进去错误的信息,就会继续被try语句块中的sc.nextInt()接收,然后又会进入到catch语句中,然后又进入循环,就这样循环往复,没完没了,所以千万记住,在处理异常的时候,要加上这样一句
2、显示所有数据
代码如下
/**
* 显示数据
*
* @param a 需要显示的数组
* @param length 需要显示数组的长度
*/
public void showData(int[] a, int length) {
for (int i = 0; i < length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
这里就比较简单了,但是为什么不是直接输出,还要设置一个长度呢?因为这里不是动态数组,数组中可能有的位置并没有被赋值,所以看起来比较尴尬
3、在指定位置插入数据
代码如下
/**
* 对数组的指定位置进行插入数据
*
* @param a 需要插入数据的数组
* @param n 需要插入数组的位置
* @param k 需要插入数组的数据
*/
public void insertAtArray(int[] a, int n, int k) {
// 首先移动数组中的位置,再进行数据的插入操作
// 特别注意下面循环中的条件,容易出现数组下表越界的问题
for (int i = a.length - 1; i > n; i--) {
a[i] = a[i - 1];
}
a[n] = k;
}
在指定位置插入数组的时候,最主要的就是弄清楚思想,实现不是很难,插入数据就是将数组从后面的位置开始,依次往后面移动。举个例子吧!比如有一个五个元素的数组a,需要在第3个位置插入一个数据,那么就要经过a[4]=a[3],a[3]=a[2],就要经过这两个步骤,然后再插入数据,这里的位置是按照数组下标来定义的,这里很尴尬的地方就是插入功能只能实现一次,因为不是动态数组,没有办法实现数组长度的变化,如果强行实现的话,那么数组中的数据将会出现丢失的现象
4、查询能够被3整除的数据
代码如下
/**
* 用于找到能够被3整除的数据
*
* @param a 被3整除的数据的数组
*/
public void divThree(int[] a) {
String str = " ";
int count = 0;// 用于计算有多少个数据可以被3整除
if(a[a.length-1]==0) {//用于判断是否插入过数据
for (int i = 0; i < a.length-1; i++) {
if (a[i] % 3 == 0) {
str = str + a[i] + " ";
count++;
}
}
}else {
for (int i = 0; i < a.length; i++) {
if (a[i] % 3 == 0) {
str = str + a[i] + " ";
count++;
}
}
}
if (count == 0) {
System.out.println("没有数据能够被3整除!");
} else {
System.out.println("被3整除的数据有" + str);
}
}
这里有一个很尴尬的地方就是判断是否插入过数据的依据是数组的最后的一个值是不是0,但是如果我插入的就是0呢?那么岂不是判断错误了,因为不是动态数组,所以只能这样实现了,以后学到了集合那里的时候,会再写一次,使用动态数组实现
6、提示信息
代码如下
/**
* 提示信息
*/
public void notice() {
System.out.println("***************************************");
System.out.println(" 1--插入数据");
System.out.println(" 2--显示所有数据");
System.out.println(" 3--在指定位置插入数据");
System.out.println(" 4--查询能够被3整除的数据");
System.out.println(" 0--退出程序");
System.out.println("***************************************");
}
这里没什么可说的,就是一些基本的操作
7、主方法
代码如下
public static void main(String[] args) {
Demo d = new Demo();
Scanner sc = new Scanner(System.in);
int input=0;//局部变量一定要给初值
int n,k;
n=0;
k=0;
int[] a = null;//这里必须要给数组一个初值,因为对于数组你不给初值,是不能够被使用的,系统不会自动给予初值的,除非在创建之后
while (true) {
d.notice();
try {
input = sc.nextInt();
}catch(InputMismatchException e) {
System.out.println("你输入的格式有误,请重新输入!");
sc.next();
continue;
}
if (input == 0) {
System.out.println("退出程序");
break;
}
switch (input) {
case 1:
a = d.insertData();
break;
case 2:
if (a != null) {
System.out.println("数组为:");
//这里很尴尬,用数组的最后一个值是不是0判断是否插入数据
if (a[a.length - 1] == 0) {
d.showData(a, a.length - 1);
} else {
d.showData(a, a.length);
}
} else {
System.out.println("数组还没有初始化!");
}
break;
case 3:
//插入数据
if(a!=null) {
System.out.println("请输入要插入的位置:");
try {
n=sc.nextInt();
System.out.println("请输入要出入的数据:");
k=sc.nextInt();
}catch(InputMismatchException e) {
System.out.println("你输入的格式有误!");
sc.next();
break;
}
d.insertAtArray(a, n, k);
}else {
System.out.println("数组还没有进行初始化!");
}
System.out.println("插入数据!");
break;
case 4:
//寻找数组中能够被3整除的数据
if(a!=null) {
d.divThree(a);
}else {
System.out.println("数组还未初始化!");
}
break;
}
}
}
对于主方法,这里要注意的地方还是异常处理的问题,记得使用一条语句装你输错的数据,不然就没完没了
还有就是对于局部变量一定要进行初值的赋予,不然就会报出NULL...什么的异常,找半天都找不到,赋一个初值也用不了多长时间,就一条语句的事情,可以省好多事情,对于引用型的数据就可以赋值为null,比如上面代码中的数组,我就将其赋值为null
总结
其实这是再次复习Java以来,写的最多的一次代码,也是个人认为最近一段时间逻辑实现最复杂的一次代码,刚拿到题目的时候,其实心里是没有任何思路的,虽然刚刚看完教学视频,但是就是没有思路,后面想了想,以前学过软件工程这一门课,书中说要先搞清楚需求什么的,所以就试了试,在你搞清楚需求之后,思路会清楚很多,虽然还是有点不知所措,不知道从哪里开始下手,后面就想着一个一个功能实现吧!然后就自己敲了出来,所以在写一些逻辑实现复杂一些的代码的时候,要先搞清楚需求,然后逐个击破,这样的话,会好很多,写起来也比较轻松!仅此作为记录