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

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始的Java开发1-2-5 Java综合案例:数组移位与统计相关的知识,希望对你有一定的参考价值。

文章目录

综合案例需求

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

  • 插入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("数组为空!"从零开始的Java开发1-6-5 集合综合案例:播放器管理

从零开始的Java开发1-5-4 ArrayListHashSetHashMap 概述与案例

从零开始的Java开发2-9-3 油画商城静态网页案例

从零开始的Java开发2-9-2 案例:仿Windows计算器

从零开始的Java开发1-6-1 集合排序:对整型和字符串Comparator接口Comparable接口

从零开始的Java开发2-10-3 JSP入门:JSP介绍语法和页面重用