package all;

import java.util.InputMismatchException;
import java.util.Scanner;

import javax.swing.plaf.synth.SynthSplitPaneUI;

/**
 * 针对数组内容进行增删改查操作
 * @author Clearlove7
 *需要注意的是不能将用户当作聪明人,不能过分相信用户。需要对用户这个群体多做提示,需要充足的限制用户的输入
 */
public class DataManger {
	
	/**
	 * 从键盘接收数据,将接收到的数据进行审核,并新增到数组中去
	 * @return
	 */
	public int[] insertData() {
		//首先定义好一个长度为10的数组
		int[] a = new int[10]; 
		// 因为Scanner类不是我们在同一个包中创建的类,是在Java JDK的类库中保存的类,所以使用的时候需要进行导入。
		// 暂时记住这个写法。 Scanner用于监听跟键盘操作相关的内容
		Scanner sc = new Scanner(System.in); // System.in 系统的输入属性
		// 为插入数据提前做准备,长度为10的数组只能暂时的接收9个数组。
		for(int i = 0; i < a.length-1; i++) {
			System.out.println("请输入第" + (i + 1) + "个数据");
			// nextInt方法用于从键盘接收整形数据
			try {
				// 将可能会发生异常的语句放置到try代码块中
				a[i] = sc.nextInt();
			} catch(InputMismatchException e) { // 通过catch语句捕获可能会发生的异常,即输入非数字的时候,执行catch代码块的内容
				System.out.println("输入的数据类型有误,不能是非数字");
				// 将有问题的键盘监听重新连接起来,使用next()方法继续去接收数据
				sc.next();
				// 为了重新输入数据,所以针对于循环做一次重新开始
				i--;
			}
			
		}
		return a;
	}
	
	/**
	 * 用于显示数组中直到要求长度的数组元素内容
	 * @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();
	}
	
	/**
	 * 从键盘接受一个数据,插入到数组 指定位置处
	 * @param a 要插入的数据的数组
	 * @param n 要插入的数据
	 * @param k 要插入的位置,从0开始
	 * 数组是定长的
	 *   1    2    3    10   4    5    6    7    8    9    0
	 * a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
	 * 在数组中插入元素,因为数组是定长的,所以数组需要其中的元素向后移动覆盖
	 */
	public void insertAtArray(int[] a,int n, int k) {
		// 首先将要插入位置处的数组元素都向后移动一位
		// 值得注意的是是从最后一位数据开始移动,避免数据被覆盖掉
		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) {
		// 用于保存能够被3整除的数据
		String str = "";
		// 能够被3整除的元素的个数
		int count = 0;
		for(int n : a) {
			if( n % 3 == 0) {
				str = str + n + " ";
				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("***************************************************");
	}
	
	/**
	 * 在主方法里面,我们更多的是希望去关注在主方法里面实现程序行为流程的控制和逻辑上的控制
	 * @param args
	 */
	public static void main(String[] args) {
		DataManger dm = new DataManger();
		/*dm.notice();
		// 直接进入了新增数据的方法
		int[] a = dm.insertData();
		dm.showData(a, a.length); // 输出全部数据
		// 在指定位置处插入数据,同样要去接收键盘输入的数据
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入要插入的数据");
		int n = sc.nextInt();
		System.out.println("请输入要插入的位置");
		int k = sc.nextInt();
		dm.insertAtArray(a, n, k);
		dm.showData(a, a.length);
		dm.divThree(a);*/
		
		
		
		// 监听键盘的操作,并接收用户输入的选择代码
		// 如果放在循环里面,会重复创建监听对象,所以提取出来
		Scanner sc = new Scanner(System.in); 
		int input;
		// 先定义数组是为空(并不是指空数组,而是指数组a指向的内存地址为空)
		int[] a = null; // 即使初始化的时候并没有指向一个内存地址
		// n 表示要插入的数组数据, k 表示要插入的数组位置
		int n = 0;
		int k = 0;
		while(true) {
			// 循环提示
			dm.notice();
			// 并且给出要求输入的提示
			System.out.println("请输入对应的数字进行操作:");
			// 接受用户选择的选择代码
			try {
				input = sc.nextInt();
			} catch(InputMismatchException e) {
				System.out.println("输入的数据格式有误,不能有非数字");
				sc.next(); // 需要使用next()方法去继续接收键盘输入的数据
				continue;
			}
			// 根据用户的选择进行操作的判断
			
			//1、针对0进行单独处理。退出程序(退出循环)
			if(input == 0) {
				System.out.println("退出程序");
				break;
			}
			
			//2、针对于1,2,3,4这4个选择代码进行判断,并提供对应的服务
			// 通过switch语句根据选择代码进行操作的选择
			switch(input) {
				case 1: { // 执行新增数据操作
					// a 现在已经给它赋值了一个真正的内存地址
					a = dm.insertData();
					// 显示用户新增的数据
					System.out.println("数组元素为:");
					// -1 是因为在insertData中限制了用户只能输入9个元素
					dm.showData(a, a.length - 1);
					break;
				}
				case 2: { // 显示所有数据
					// 需要先判断数组有没有进行赋值
					if(a != null) {
						System.out.println("数组元素为:");
						// 如果数组的最后一个元素为0,可以简单地认为数组还没有插入数据,因此不显示最后一个元素
						if(a[a.length - 1] == 0) {
							dm.showData(a, a.length - 1);
						} else {
							dm.showData(a, a.length);
						}
					} else {
						System.out.println("还未在数组中插入数据!");
					}
					break;
				}
				case 3: { // 在指定位置处插入数据
					if(a != null) {
						System.out.println("请输入要插入的数据");
						try { // 可以使用 try 将这两个接收键盘数据的方法包裹起来
							n = sc.nextInt();
							System.out.println("请输入要插入数据的位置:");
							k = sc.nextInt();
						}catch(InputMismatchException e) {
							System.out.println("输入的数据格式有误,不能有非数字");
							sc.next(); 
							break; // 因为switch语句中,我们已经执行到while循环的最后面了,所以使用continue用处不大,所以使用break终止switch语句的执行
						}
						// 调用插入数据的方法
						dm.insertAtArray(a, n, k);
						// 插入数据后开始展示数据
						dm.showData(a, a.length);
					} else {
						System.out.println("还未在数组中插入数据!");
					}
					break;
				}
				case 4: { // 查询能够被3整除的数据
					if(a != null) {
						dm.divThree(a);
					} else {
						System.out.println("还未在数组中插入数据!");
					}
					break;
				}
				default: { // 防止用户输入1,2,3,4,0之外的数字
					System.out.println("请输入对应的数字进行操作!");
				}
			}
		}
	}
}

/*
***************************************************
                     1-- 插入数据
                     2-- 显示所有数据
                     3-- 在指定位置处插入数据
                     4-- 查询能够被3整除的数据
                     0-- 退出
***************************************************
请输入对应的数字进行操作:

1
请输入第1个数据

1
请输入第2个数据

2
请输入第3个数据

3
请输入第4个数据

4
请输入第5个数据

5
请输入第6个数据

6
请输入第7个数据

7
请输入第8个数据

8
请输入第9个数据

9
数组元素为:
1 2 3 4 5 6 7 8 9 
***************************************************
                     1-- 插入数据
                     2-- 显示所有数据
                     3-- 在指定位置处插入数据
                     4-- 查询能够被3整除的数据
                     0-- 退出
***************************************************
请输入对应的数字进行操作:
3
请输入要插入的数据

12
请输入要插入数据的位置:

3
1 2 3 12 4 5 6 7 8 9 
***************************************************
                     1-- 插入数据
                     2-- 显示所有数据
                     3-- 在指定位置处插入数据
                     4-- 查询能够被3整除的数据
                     0-- 退出
***************************************************
请输入对应的数字进行操作:

4
数组中能够被3整除的数据为:3 12 6 9 
***************************************************
                     1-- 插入数据
                     2-- 显示所有数据
                     3-- 在指定位置处插入数据
                     4-- 查询能够被3整除的数据
                     0-- 退出
***************************************************
请输入对应的数字进行操作:

2
数组元素为:
1 2 3 12 4 5 6 7 8 9 
***************************************************
                     1-- 插入数据
                     2-- 显示所有数据
                     3-- 在指定位置处插入数据
                     4-- 查询能够被3整除的数据
                     0-- 退出
***************************************************
请输入对应的数字进行操作:

0
退出程序 */