【从零开始的Java开发】1-2-5 Java综合案例:数组移位与统计

本文档介绍了一个Java程序,用于管理数组数据,包括插入、显示、指定位置插入和查找能被3整除的元素。程序通过键盘接收数据,处理非数字输入异常,并提供了友好的用户交互提示。此外,还展示了如何处理输入错误,确保数组操作的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

综合案例需求

需求:定义一个类,对数组中的数据进行管理。
管理包括:

  • 插入9个数据
  • 显示所有数据
  • 在指定位置处插入数据
  • 查询能被3整除的数据

我们这里数组长度为10,第一步插入9个数据,然后预留一个位置给“在指定位置插入数据”。

方法:
插入数据:

public int[] insertData(){}

显示所有数据:

public void showData(int[]a,int n){}

在指定位置处插入数据:

public void insertAtArray(int[]a,int n,int k){};//k表示位置

查询能被3整除的数据:

public void divThree(int[]a){}

从键盘接收数据:插入9个数据

代码1.0:

public int[] insertDate() {
		// 定义一个长度为10的数组,这里只插入9个数据
		int[] a = new int[10];
		// 要从键盘接收数据
		Scanner sc = new Scanner(System.in);
		for (int i = 0; i < a.length - 1; i++) {
			System.out.println("请输入第" + (i + 1) + "个数据");
			// 把从键盘接受的数据放到a[i]数组中
			a[i] = sc.nextInt();			
		}
		return a;
	}

这里我们对代码进行测试:如果我们输入1a,则会输出:

Exception in thread "main" java.util.InputMismatchException
	at java.base/java.util.Scanner.throwFor(Scanner.java:939)
	at java.base/java.util.Scanner.next(Scanner.java:1594)
	at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
	at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
	at t1/com.t1.dataManage.insertDate(dataManage.java:19)
	at t1/com.t1.dataManage.main(dataManage.java:31)

所以我们要把这种情况算进去, 当输入非数字时,sc.nextInt()语句会发生异常,执行catch后面的语句

try {
	a[i] = sc.nextInt();
	} catch (java.util.InputMismatchException e) {
		System.out.println("输入的格式有误,不能接受非数字");
	}

得到代码2.0:

package com.t1;

import java.util.*;//Scanner类的包
public class dataManage {

	public int[] insertDate() {
		// 定义一个长度为10的数组,这里只插入9个数据
		int[] a = new int[10];
		// 要从键盘接收数据
		Scanner sc = new Scanner(System.in);
		for (int i = 0; i < a.length - 1; i++) {
			System.out.println("请输入第" + (i + 1) + "个数据");
			// 把从键盘接受的数据放到a[i]数组中
			try {
				a[i] = sc.nextInt();
			} catch (java.util.InputMismatchException e) {
				System.out.println("输入的格式有误,不能接受非数字");
			}

		}
		return a;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		dataManage dataManage1 = new dataManage();
		int[] a = dataManage1.insertDate();
		for (int i : a) {
			System.out.print(i+" ");
		}

	}

}

输入:

a

输出:

请输入第1个数据
a
输入的格式有误,不能接受非数字
请输入第2个数据
输入的格式有误,不能接受非数字
请输入第3个数据
输入的格式有误,不能接受非数字
请输入第4个数据
输入的格式有误,不能接受非数字
请输入第5个数据
输入的格式有误,不能接受非数字
请输入第6个数据
输入的格式有误,不能接受非数字
请输入第7个数据
输入的格式有误,不能接受非数字
请输入第8个数据
输入的格式有误,不能接受非数字
请输入第9个数据
输入的格式有误,不能接受非数字
0 0 0 0 0 0 0 0 0 0 

显然又发生了错误,我们还要对代码进行改进。
错误原因:
第一次输入的a没有被接收,因为它不是整型。
那么在循环到了第二次时,这个a还是没有被接收,因为它不是整型…
这个a就没有被接收过,所以会一直报错。

改成:

try {
	a[i] = sc.nextInt();
	} catch (java.util.InputMismatchException e) {
	System.out.println("输入的格式有误,不能接受非数字");
	// 这里输入错误 但是要把它接收了
	sc.next();// 接收一个字符串
	}

我们再对代码进行测试,输入:

a

输出:

请输入第1个数据
a
输入的格式有误,不能接受非数字
请输入第2个数据

显然又有问题,我们第一个数字的输入是错误的,然后就要输入第二个数字,跳过了第一个数字的输入。

改成:

try {
	a[i] = sc.nextInt();
	} catch (java.util.InputMismatchException e) {
	System.out.println("输入的格式有误,不能接受非数字");
	// 这里输入错误 但是要把它接收了
	sc.next();// 接受一个字符串
	i--;
	}

测试一下:

请输入第1个数据
a
输入的格式有误,不能接受非数字
请输入第1个数据
a
输入的格式有误,不能接受非数字
请输入第1个数据
1
请输入第2个数据

这下就对了。

这个函数的总体代码:

public int[] insertDate() {
		// 定义一个长度为10的数组,这里只插入9个数据
		int[] a = new int[10];
		// 要从键盘接收数据
		Scanner sc = new Scanner(System.in);
		for (int i = 0; i < a.length - 1; i++) {
			System.out.println("请输入第" + (i + 1) + "个数据");
			// 把从键盘接受的数据放到a[i]数组中
			try {
				a[i] = sc.nextInt();
			} catch (java.util.InputMismatchException e) {
				System.out.println("输入的格式有误,不能接受非数字");
				// 这里输入错误 但是要把它接收了
				sc.next();// 接受一个字符串
				i--;
			}

		}
		return a;
	}

数组元素的显示

代码:

/**
	 * 显示数组中元素的内容
	 * 
	 * @param a:数组名
	 * @param n:数组长度
	 */
	public void showData(int[] a, int n) {
		for (int i = 0; i < n; i++) {
			System.out.print(a[i] + " ");
		}
		System.out.println();
	}

在指定位置插入数据

/**
	 * 从键盘接收一个数据插入到数组的指定位置处
	 * 
	 * @param a:要插入数据的数组
	 * @param n:要插入的数据
	 * @param k:要插入的位置,从0开始
	 */
	public void insertAtArray(int[] a, int n, int k) {
		// 从0开始,所以最后一个元素的下标是a.length-1
		for (int i = a.length - 1; i > k; i--) {
			a[i] = a[i - 1];
		}
		a[k] = n;
	}

查询能被3整除的数组元素

/**
	 * 输出能被3整除的数组元素
	 * 
	 * @param a:数组
	 */
	public void divThree(int[] a) {
		String str = "";
		int count = 0;
		for (int i : a) {
			if (i % 3 == 0) {
				str = str + i + " ";
				count++;
			}
		}
		if (count == 0) {
			System.out.println("没有能被3整除的元素!");
		} else {
			System.out.println("能被3整除的元素为:" + str);
		}
	}

整体代码:

package com.t1;

import java.util.*;//Scanner类的包

/**
 * 从键盘接收整型数据存放在数组中,并对数组中的数据进行管理
 * 
 * @author karsh
 *
 */
public class dataManage {

	public int[] insertDate() {
		// 定义一个长度为10的数组,这里只插入9个数据
		int[] a = new int[10];
		// 要从键盘接收数据
		Scanner sc = new Scanner(System.in);
		for (int i = 0; i < a.length - 1; i++) {
			System.out.println("请输入第" + (i + 1) + "个数据");
			// 把从键盘接受的数据放到a[i]数组中
			try {
				a[i] = sc.nextInt();
			} catch (java.util.InputMismatchException e) {
				System.out.println("输入的格式有误,不能接受非数字");
				// 这里输入错误 但是要把它接收了
				sc.next();// 接受一个字符串
				i--;
			}

		}
		return a;
	}

	/**
	 * 显示数组中元素的内容
	 * 
	 * @param a:数组名
	 * @param n:数组长度
	 */
	public void showData(int[] a, int n) {
		for (int i = 0; i < n; i++) {
			System.out.print(a[i] + " ");
		}
		System.out.println();
	}

	/**
	 * 从键盘接收一个数据插入到数组的指定位置处
	 * 
	 * @param a:要插入数据的数组
	 * @param n:要插入的数据
	 * @param k:要插入的位置,从0开始
	 */
	public void insertAtArray(int[] a, int n, int k) {
		// 从0开始,所以最后一个元素的下标是a.length-1
		for (int i = a.length - 1; i > k; i--) {
			a[i] = a[i - 1];
		}
		a[k] = n;
	}

	/**
	 * 输出能被3整除的数组元素
	 * 
	 * @param a:数组
	 */
	public void divThree(int[] a) {
		String str = "";
		int count = 0;
		for (int i : a) {
			if (i % 3 == 0) {
				str = str + i + " ";
				count++;
			}
		}
		if (count == 0) {
			System.out.println("没有能被3整除的元素!");
		} else {
			System.out.println("能被3整除的元素为:" + str);
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		dataManage dataManage1 = new dataManage();
		int[] a = dataManage1.insertDate();
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入要插入的元素:");
		int n=sc.nextInt();
		System.out.println("请输入要插入的位置:");
		int k=sc.nextInt();	
		dataManage1.insertAtArray(a, n, k);
		System.out.println("输出数组:");
		dataManage1.showData(a, a.length);
		dataManage1.divThree(a);
	}

}

测试一下:
输入:

1 2 3 4 5 6 7 8 999
1000
1

输出:

请输入第1个数据
1
请输入第2个数据
2
请输入第3个数据
3
请输入第4个数据
4
请输入第5个数据
5
请输入第6个数据
6
请输入第7个数据
7
请输入第8个数据
8
请输入第9个数据
999
请输入要插入的元素:
1000
请输入要插入的位置:
1
输出数组:
1 1000 2 3 4 5 6 7 8 999 
能被3整除的元素为:3 6 999 

提示信息的方法

代码:

/**
	 * 提示信息
	 */
	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("************************************************");
	}

主方法

public static void main(String[] args) {
		// TODO Auto-generated method stub
		dataManage dataManage1 = new dataManage();
		Scanner sc = new Scanner(System.in);
		int input = 0;// 主方法中定义的变量都是局部变量,都要初始化
		int[] a = null;
		// 循环输入数字
		while (true) {
			dataManage1.notice();
			System.out.println("请输入对应的数字进行操作:");
			try {
				input = sc.nextInt();
			} catch (java.util.InputMismatchException e) {
				System.out.println("输入的格式有误,不能接受非数字");
				sc.next();
				continue;
			}

			if (input == 0) {
				System.out.println("退出程序!");
				break;
			} else {
				switch (input) {
				case 1: {
					System.out.println("插入九个数据");
					a = dataManage1.insertDate();
					break;
				}
				case 2: {
					System.out.println("显示数据");
					if (a == null) {
						System.out.println("数组为空!");
					} else {
						int temp = a[a.length - 1];
						if (temp == 0)
							dataManage1.showData(a, a.length - 1);
						else
							dataManage1.showData(a, a.length);
					}

					break;
				}
				case 3: {
					System.out.println("插入指定数据");
					if (a == null)
						System.out.println("数组为空,不能插入!");
					else {
						int n, k;
						try {
							System.out.println("请输入要插入的数据:");
							n = sc.nextInt();
							System.out.println("请输入要插入数据的位置:");
							k = sc.nextInt();
						} catch (java.util.InputMismatchException e) {
							System.out.println("输入的格式有误,不能接受非数字");
							sc.next();
							break;
						}

						dataManage1.insertAtArray(a, n, k);
						dataManage1.showData(a, a.length);
					}

					break;
				}
				case 4: {
					System.out.println("查询能被3整除的数据");
					if (a != null)
						dataManage1.divThree(a);
					else
						System.out.println("数组为空,不能查询!");
					break;
				}
				}
			}
		}
	}

整体代码

package com.t1;

import java.util.*;//Scanner类的包

/**
 * 从键盘接收整型数据存放在数组中,并对数组中的数据进行管理
 * 
 * @author karsh
 *
 */
public class dataManage {

	public int[] insertDate() {
		// 定义一个长度为10的数组,这里只插入9个数据
		int[] a = new int[10];
		// 要从键盘接收数据
		Scanner sc = new Scanner(System.in);
		for (int i = 0; i < a.length - 1; i++) {
			System.out.println("请输入第" + (i + 1) + "个数据");
			// 把从键盘接受的数据放到a[i]数组中
			try {
				a[i] = sc.nextInt();
			} catch (java.util.InputMismatchException e) {
				System.out.println("输入的格式有误,不能接受非数字");
				// 这里输入错误 但是要把它接收了
				sc.next();// 接受一个字符串
				i--;
			}

		}
		return a;
	}

	/**
	 * 显示数组中元素的内容
	 * 
	 * @param a:数组名
	 * @param n:数组长度
	 */
	public void showData(int[] a, int n) {
		for (int i = 0; i < n; i++) {
			System.out.print(a[i] + " ");
		}
		System.out.println();
	}

	/**
	 * 从键盘接收一个数据插入到数组的指定位置处
	 * 
	 * @param a:要插入数据的数组
	 * @param n:要插入的数据
	 * @param k:要插入的位置,从0开始
	 */
	public void insertAtArray(int[] a, int n, int k) {
		// 从0开始,所以最后一个元素的下标是a.length-1
		for (int i = a.length - 1; i > k; i--) {
			a[i] = a[i - 1];
		}
		a[k] = n;
	}

	/**
	 * 输出能被3整除的数组元素
	 * 
	 * @param a:数组
	 */
	public void divThree(int[] a) {
		String str = "";
		int count = 0;
		for (int i : a) {
			if (i % 3 == 0) {
				str = str + i + " ";
				count++;
			}
		}
		if (count == 0) {
			System.out.println("没有能被3整除的元素!");
		} else {
			System.out.println("能被3整除的元素为:" + str);
		}
	}

	/**
	 * 提示信息
	 */
	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("************************************************");
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		dataManage dataManage1 = new dataManage();
		Scanner sc = new Scanner(System.in);
		int input = 0;// 主方法中定义的变量都是局部变量,都要初始化
		int[] a = null;
		// 循环输入数字
		while (true) {
			dataManage1.notice();
			System.out.println("请输入对应的数字进行操作:");
			try {
				input = sc.nextInt();
			} catch (java.util.InputMismatchException e) {
				System.out.println("输入的格式有误,不能接受非数字");
				sc.next();
				continue;
			}

			if (input == 0) {
				System.out.println("退出程序!");
				break;
			} else {
				switch (input) {
				case 1: {
					System.out.println("插入九个数据");
					a = dataManage1.insertDate();
					break;
				}
				case 2: {
					System.out.println("显示数据");
					if (a == null) {
						System.out.println("数组为空!");
					} else {
						int temp = a[a.length - 1];
						if (temp == 0)
							dataManage1.showData(a, a.length - 1);
						else
							dataManage1.showData(a, a.length);
					}

					break;
				}
				case 3: {
					System.out.println("插入指定数据");
					if (a == null)
						System.out.println("数组为空,不能插入!");
					else {
						int n, k;
						try {
							System.out.println("请输入要插入的数据:");
							n = sc.nextInt();
							System.out.println("请输入要插入数据的位置:");
							k = sc.nextInt();
						} catch (java.util.InputMismatchException e) {
							System.out.println("输入的格式有误,不能接受非数字");
							sc.next();
							break;
						}

						dataManage1.insertAtArray(a, n, k);
						dataManage1.showData(a, a.length);
					}

					break;
				}
				case 4: {
					System.out.println("查询能被3整除的数据");
					if (a != null)
						dataManage1.divThree(a);
					else
						System.out.println("数组为空,不能查询!");
					break;
				}
				}
			}
		}
	}

}

学到的新东西

try…catch异常:

try {
	a[i] = sc.nextInt();
	} catch (java.util.InputMismatchException e) {
	System.out.println("输入的格式有误,不能接受非数字");
	// 这里输入错误 但是要把它接收了
	sc.next();// 接受一个字符串
	i--;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

karshey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值