再java中首字母大写的即刻看作为类
Scanner这个类,不是我们在同一个包中创建的类,该类存储在Java JDK的类库中,所以我们需要告诉当前程序我们使用的是什么类,即通过alt+/方式引入该类
Scanner监听我们跟键盘有关的操作,监听内容来源是系统输入
Scanner监听我们跟键盘有关的操作,监听内容来源是系统输入
nextInt()方法用于从键盘接收整型数据,如果接收到的是非整型类型就会出现输入无法匹配异常报错
try{}catch{}异常捕获,将可能发生异常的代码放置到try的大括号中{}(代码块)
catch{}如果发生异常则在catch语句块中处理异常,如果没有发生异常,不执行catch中的任何内容
当使用try-catch及捕获异常的时候,即使程序发生异常,该程序依旧会往下执行
TODO利用自动生成标记,表明代码未完成TODO
println()使用空内容打印,将打印内容换行 +ln自带换行 所以不需要写转义字符\n
break用于switch语句中,终止switch语句
break用于循环时,跳出循环
continue用在循环中,跳出本次循环,继续执行下一次循环
如果一个引用数据类型 的值为null的话 此时调用它的属性或方法则会发生空指针异常,这是因为这些属性或方法指向了一个空的内存地址,无法的到任何有用的信息
需要定义的程序服务反复一直运行的话可以设置死循环(true){}
package com.dodoke.datamanger;
import java.util.Scanner;
public class DataManger {
/**
* 从键盘接收数据,并审核数据,将数据添加到数组中去
* @return
*/
public int[] inserData(){
//先定义一个长度为10的整型数组
int[] arr = new int[10];//动态初始话长度为10的数组
//要去新增数据-得到数据源,来自键盘 Scanner是jdk写的类 所以直接写会报错
//Scanner这个类,不是我们在同一个包中创建的类,该类存储在Java JDK的类库中,所以我们需要告诉当前程序我们使用的是什么类,即通过alt+/方式引入该类
//Scanner监听我们跟键盘有关的操作,监听内容来源是系统输入
Scanner sc = new Scanner(System.in);//从外部进入程序的数据统称为输入型数据,只会找跟键盘有关的操作
System.out.println("请暂时输入9个数据,保留最后一位数据以供添加新数据");
//为了等下更好的插入数据,所以长度为10的数组只新增9个数据,为插入数据留一个空位
for(int i = 0; i < arr.length - 1; i++){//而所接受的数据是10个 所以就添加循环重复10次接收数据
System.out.println("请输入第" + (i + 1) + "个数据");//应为输入一次之后程序就停止了
//System.out.println(sc.next());//不断循环next()方法,可以不断接受数据
//应为要将数据插入到整型数组中,所以需要保证接收到的数据为整型数据
//nextInt()方法用于从键盘接收整型数据,如果接收到的是非整型类型就会出现输入无法匹配异常报错
try {
//异常捕获,将可能发生异常的代码放置到try的大括号中{}(代码块)
//System.out.println(sc.nextInt());
arr[i] = sc.nextInt();
} catch(Exception e) {//Exception异常的父类 并给定义一个名称
//如果发生异常则在catch语句块中处理异常,如果没有发生异常,不执行catch中的任何内容
System.out.println("输入的数据类型有误,请重新添加!");
//在使用nextInt方法发生异常时,程序监听键盘的输入会中断,需要我们将有问题的键盘监听重新链接起来,使用next()方法重新链接键盘
sc.nextInt();
//为了能够重新输入数据,所以需要针对循环做一次重新开始
i--;
}
}
//返回创建的数组,并新增元素的数组
return arr;
}
// 利用自动生成标记,表明代码未完成TODO
/**
* 从键盘接收数组,用于插入到数组指定位置处
* @param a 要插入数据的数组
* @param n 要插入的数据
* @param k 要插入到位置,从0开始,小于数组的长度,不在本方法中考虑k的范围
*/
public void insertAtArray(int[] a,int n,int k) {
//为了避免数据覆盖,所以从最后一个数据开始移动
for(int i = a.length - 1; i > k - 1; i--){
a[i] = a[i - 1];//用前面一个元素的值覆盖后面一个元素的值
}
a[k - 1] = n;
}
/**
* 输出数组中能被3整除的数据
* @param a 数组名
*/
public void divThree(int[] a) {
String str = "";//用空字符出串保存能被3整除的数据
int count = 0;//设置变量保存能被3整除的数组元素的个数
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);
}
}
/**
* 按个数,显示数组中元素的内容
* @param a 数组
* @param length 显示数组元素的个数
*/
public void showData(int[] a, int length) {
for(int i = 0; i < length; i++){
System.out.print(a[i] + " ");//print把ln去掉让数组元素显示在一行以内
}
System.out.println();//使用空内容打印,将打印内容换行 +ln自带换行 所以不需要写转义字符\n
}
/*public static void main(String[] args) {
DataManger dm = new DataManger();
int[] arr = dm.inserData();
dm.showData(arr,arr.length);
Scanner sc = new Scanner(System.in);//暂不处理非整数输入的问题
System.out.println("请输入要插入的数据:");
int n = sc.nextInt();
System.out.println("请输入要插入的位置:");
int k = sc.nextInt();
while(true){//设置死循环
if(k < 1 || k >= arr.length){
System.out.println("插入位置错误,请重新输入大于0,小于等于" + arr.length + "的数值!");
System.out.println("请输入要插入的位置:");
k = sc.nextInt();
}else {
break;//跳出本次死循环
}
}
dm.insertAtArray(arr,n,k);
dm.showData(arr,arr.length);
dm.divThree(arr);
}*/
/**
* 主方法流程提示信息
*/
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();
//要根据用户的输入为用户提供服务
Scanner sc = new Scanner(System.in);
//将接收用户输入的变量提取出来,延长它再内存中的使用寿命
int input;
//提前先准备好数组
//如果一个引用数据类型 的值为null的话 此时调用它的属性或方法则会发生空指针异常,这是因为这些属性或方法指向了一个空的内存地址,无法的到任何有用的信息
int[] a = null;//null代表设为空 这个a不指向任何的堆内存空间,没有方法调用属性调用内存内的信息
//如果不定义为null的话再之后的使用中时会出错的
int n = 0, k = 0;//n表示要插入的数据,k表示要插入的位置
//为了多次提示和不间断的提供服务需要设置一个循环,这个循环控制着服务程序一直运转,并可由用户停用服务
while(true){//设置死循环 让服务一直运行
//循环提示信息
dm.notice();
//进行用户操作的提示
System.out.println("请输入对应的数组选择所需的功能,进行操作:");
try{
input = sc.nextInt();
} catch(Exception e){//当使用try-catch及捕获异常的时候,即使程序发生异常,该程序依旧会往下执行
//再java中首字母大写的即刻看作为类
System.out.println("输入的数据格式有误,不能为非数字!");
sc.next();//为了是键盘接受数据重新链接上调用next放啊
//需要使程序发生错误时避免继续执行
continue;//使用cintinue跳出此次循环这样再后面的调用中就不出现报错
//避免再没有赋值的情况下对后面的input赋值的判断
}
//变量input定义在循环当中 java的循环里的垃圾回收机制 会再每一次循环使用结束后回收掉循环内创建的变量
//这种垃圾回收机制很不建议使用
//int input = sc.nextInt();
//根据用户的输入提供相应的服务,即判断iput的值
//针对0做单独判断,因为只能执行一次
if(input == 0){//接收的时用户输入的的值,来进行判断 所以我们不能自己赋值 因为如果赋值的话就会对之后的判断产生影响
System.out.println("退出程序!");
break;//退出程序
}
//判断input其他的输入
switch(input){
case 1:{
//System.out.println("插入数据");
//插入数据,并接收新创建的数组
a = dm.inserData();
//显示数据
System.out.println("数组元素为:");
dm.showData(a, a.length);
break;//这里的break只作用于switch语句
}
case 2:{
//显示数据,需要先判断数组是否已经进行赋值,如果数组赋值显示数组,如果数组没有赋值就提示 再次进行赋值
if(a != null){
System.out.println("数组元素为:");
dm.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(Exception e){
System.out.println("输入的格式有误,不能有非数字");
sc.next();
break;
}
dm.insertAtArray(a, n, k);
System.out.println("新增数据后,数组元素为:");
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:{
System.out.println("输入的数字有误,请输入对应的数字进行相关操作");
}
}
}
}
}
package my_two_porject;
import java.util.InputMismatchException;
import java.util.Scanner;
/**
* Java数组位移与统计
* (1)插入数据 insertData
* (2)显示所有数据 showData
* (3)在指定位置处插入数据 insertAtArray
* (4)查询能被3整除的数据 divThree
*/
public class DateManger {
/**
* 将接收到的数据进行审核并新增到数组中去
*/
public int[] insertData() {
//首先定义好一个长度为10的数组
int[] a = new int[10];
//因为Scanner类是在Java JDK的类库中保存的类 所以使用的时候需要进行导入
//暂时记住这个写法 Scanner用于监听跟键盘操作相关的内容
@SuppressWarnings("resource")
Scanner sc = new Scanner(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;
}
/**
* 显示数组中元素的内容
*/
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 要插入的位置
*/
public void insertAtArray(int[] a, int n, int k) {
//注意从最后一个数据开始移动,避免数据覆盖
//如果数据溢出 只要将倒数第二个数据覆盖最后一个即可
for (int i = a.length - 1; i > k - 1; i--) {
a[i] = a[i - 1];
}
//在第k个位置插入值 需要将索引值为k-1的数据覆盖
a[k - 1] = n;
}
/**
* 输出数组中能被3整除的元素
*
*/
public void divThree(int[] a) {
String str = "";//用于保存能被三整除的数据
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("********************************************");
}
/**
* 主方法的实现
*/
public static void main(String[] args) {
DateManger dm = new DateManger();
// int[] a = dm.insertData();
// * dm.showData(a, 8);//输出全部数据
// 将接收数据语句提取出来
Scanner sc = new Scanner(System.in);
// 将输入数据提取出来
int input;
int[] a = null;//先定义数组为一个空数组
int n=0,k=0;//n表示要插入的数据,k表示插入位置
// 1 首先实现循环输入5个指示数字
while (true) {
// 循环提示
dm.notice();
// 进行提示
System.out.println("请输入对应的数字进行操作:");
// 接收键盘操作数据
try{
input = sc.nextInt();
}catch(InputMismatchException e){
System.out.println("输入的数据格式有误,不能有非数字!");
sc.next();
continue;
}
// 针对0单独处理,退出程序(退出循环)
if (input == 0) {
System.out.println("退出程序!");
break;
}
// 通过switch语句根据操作数进行操作的选择
switch (input) {
case 1:{
//插入数据,并接收得到的数据
a = dm.insertData();
//显示数据
System.out.println("数组元素为:");
dm.showData(a, a.length-1);
break;
}
case 2: {//显示数据
//需要判断数组是否已经赋值
if(a != null) {
System.out.println("数组元素为:");
if(a[a.length-1]==0){
//如果数组的最后一个元素为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{
n=sc.nextInt();
System.out.println("请输入要插入数据的位置:");
k=sc.nextInt();
}catch(InputMismatchException e){
System.out.println("输入的数据格式有误,不能有非数字!");
sc.next();
break;
}
dm.insertAtArray(a, n, k);
dm.showData(a, a.length);
}else{
System.out.println("还未在数组中插入数据,请重新选择操作!");
}
break;
}
//查询数组中能被3整除的元素
case 4: {
//查询数组中能被3整除的元素
if(a!=null){
dm.divThree(a);
}else{
System.out.println("还未在数组中插入数据,请重新选择操作!");
}
break;
}
//输入的菜单选项不合法
default: {
System.out.println("输入无效!");
}
}
}
}
}