# 數組移位與統計
[TOC]
## 導學
本節課,我們來針對之前學習過的內容進行一次綜合應用。通過一個案例,來復習和學習一個比較綜合的程序的編程過程。
## 需求分析
需求:定義一個類,對數組中的數據進行管理(增刪改查)
方法:
1. 插入數據:`public int[] insertData() {}`
2. 顯示所有數據 `public void showData(int[] a, int length) {}`
3. 在指定位置處插入數據 `public void insertAtArray(int[] a,int n,int k) {}`
4. 查詢能被3整除的數據 `public void divThree(int[] a) {}`
## 基礎方法的實現
### 從鍵盤接收數據
~~~
/**
* 從鍵盤接收數據,將接收到的數據進行審核,并新增到數組中去
* @return
*/
public int[] insertData() {
//首先定義好一個長度為10的數組
int[] a = new int[10];
//因為Scanner類,不是我們在同一個包中創建的類,是在Java JDK的類庫中保存的類,所以使用的時候需要進行導入。
//暫時記住這個寫法,Scanner用于監聽跟鍵盤操作相關的內容
Scanner sc = new Scanner(System.in);
//為插入數據提前做準備,長度為10的數組只能暫時先接收九個數據。
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開始
*/
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;
}
public static void main(String[] args) {
DataManger dm = new DataManger();
int[] a = dm.insertData();
dm.showData(a, a.length-1);//輸出全部數據
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);
}
~~~
### 能被3整除的方法
~~~
/**
* 輸出數組中能被3整除的元素
*
* @param a
*/
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 static void main(String[] args) {
DataManger dm = new DataManger();
int[] a = dm.insertData();
dm.showData(a, a.length-1);//輸出全部數據
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);
}
~~~
### 提示信息方法的實現
即實現在主方法中流程的控制,我們希望在主方法中更多的去關注實現邏輯上的控制。
~~~
/**
* 提示信息
*/
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) {
DataManger dm = new DataManger();
// 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;
}
case 4:{
//查詢數組中能被3整除的元素
if(a!=null){
dm.divThree(a);
}else{
System.out.println("還未在數組中插入數據,請重新選擇操作!");
}
break;
}
default: {
System.out.println("請輸入對應的數字進行操作!");
}
}
}
}
~~~