第1關:數組的復制
任務描述
本關任務:完成將一個數組的值復制給另一個數組。
相關知識
本關需要你完成數組的復制操作,可以分三個步驟來實現。
- 創建一個數組
arr2,數組長度和數組arr1相同; - 使用循環將數組1中的每一個數據賦值給數組2中對應的那一項。(即arr2[0] = arr1[0]);
- 循環輸出復制之后arr2中的所有數據。
編程要求
在右側編輯器Begin-End中填充代碼,將arr1數組中的數據全部復制給arr2數組,最后輸出arr2中所有的數據。
3## 測試說明
我會對你的程序進行測試,如下:
測試輸入:1,3,12
預期輸出:
1
3
12
測試輸入:2,13,11
預期輸出:
2
13
11
實驗代碼
package step1;
import java.util.Scanner;
public class HelloWorld {
public static void main(String[] args) {
//動態構建arr1
int[] arr1 = new int[3];
Scanner sc = new Scanner(System.in);
for(int i = 0 ; i< arr1.length ; i++){
arr1[i] = sc.nextInt();
}
/********** Begin **********/
//創建數組arr2
int[] arr2 = new int[3];
//使用for循環將arr1的數據復制給arr2
for(int i=0; i<arr2.length; i++){
arr2[i] = arr1[i];
}
//輸出arr2
for(int i=0; i<arr2.length; i++){
System.out.println(arr2[i]);
}
/********** End **********/
}
}
第2關:數組中元素的查找
任務描述
本關任務:完成查找字符串數組中指定字符串位置的小程序。
3## 相關知識
為了完成本關任務,你需要知道:如何判斷兩個字符串是否相等。
如何判斷字符串相等
我們之前判斷兩個數是否相等使用的是符號,我們判斷字符串是否相等能否用符號呢?我們來看一段代碼。
String str = "hello";
String str1 = new String("hello");
System.out.println("str的值為"+str);
System.out.println("str1的值為"+str1);
System.out.println("str與str1是否相等"+(str == str1));
輸出結果:
str的值為hello
str1的值為hello
str與str1是否相等false
為什么呢?
是因為==比較的是兩個對象的內存地址,我們知道變量被創建的時候就相當於在內存中開辟空間,而案例中str和str1就是占用的兩塊不同的空間,所以他們的內存地址是不一致的,在用==符號判斷的時候就不相等了,即為false。

也許你會這樣子嘗試:
String str = "hello";
String str1 = "hello";
System.out.println("str的值為"+str);
System.out.println("str1的值為"+str1);
System.out.println("str與str1是否相等"+(str == str1));
這個時候的輸出結果就可能會讓你感覺疑惑:
str的值為hello
str1的值為hello
str與str1是否相等true
這又是什么原因呢?是因為定義String str = "hello"和String str1 = "hello"沒有進行對象的創建,而是同時指向的一個對象,所以他們的內存地址是相同的。

問題來了,既然==不能用,那我們應該用什么呢?
在Java中判斷兩個字符串是否相等,需要使用equals方法;
語法:字符串1.equals(字符串2) 如果字符串1等於字符串2返回true,否則返回false;
例如:
String str = "hello";
String str1 = new String("hello");
System.out.println("str與str1是否相等"+(str.equals(str1)));
輸出: str與str1是否相等true
編程要求
在右側編輯器Begin-end處填充代碼,實現在數組中查找指定字符串位置的功能。
測試說明
測試輸入:張三
預期輸出:張三在數組的第1個位置
測試輸入:張富貴
預期輸出:張富貴在數組的第5個位置
實現代碼:
package step2;
import java.util.Scanner;
public class HelloWorld {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//str為要查找的字符串
String str = sc.next();
/********** Begin **********/
//創建數組 arr 給數組賦值 {"張三","張三豐","張無忌","王二麻子","張富貴"}
String[] arr = {"張三","張三豐","張無忌","王二麻子","張富貴"};
for(int i=0; i<arr.length; i++){
if(str.equals(arr[i])){
System.out.println(str+"在數組的第"+(i+1)+"個位置");
}/*else{
break; //不進行break,break是跳出當前循環,t如果跳出循環,則只比較一次
} */
}
/********** End **********/
}
}
實驗分析
- ==比較的是兩個對象的內存地址。如果不創建對象,則兩個變量同時指向一個對象,內存地址相同;如果創建對象,則指向兩個不同的對象,內存地址不同。
- break是跳出本次循環
第4關:選擇排序
任務描述
本關任務:實現數組從大到小的排序(降序排序)。
相關知識
為了解決數組排序的問題你需要先了解:選擇排序。
選擇排序
關於選擇排序,你可以理解為一個循環打擂台的過程,還記得我們在上一章節中求數組中的最大值嗎?

我們運用打擂台的原理,可以求出數組中的最大值。
核心代碼:
int max = scores[0];
for (int i = 1; i < scores.length; i++) {
if(max < scores[i]){ //求最大值
max = scores[i];
}
}
這樣一輪循環之后我們就可以求出數組scores的最大值。
第一輪擂台賽求出最大值之后,我們可以對接下來的數據再進行打擂台的操作,就出剩下數據的最大值(也就是第二大的值),以此類推,就可以實現數組從大到小的排序。
實現過程
為了實現選擇排序,我們需要求出最大值,並且和相比較的數據交換位置:接下來我們對數組int[] arr = {6,5,8,0,2,9}來進行第一趟循環,將最大值移動到數組的第一位。

代碼實現:
int[] arr = {6,5,8,0,2,9};
for (int i = 0; i < arr.length-1; i++) {
if(arr[0] < arr[i+1]){
int temp = arr[0];
arr[0] = arr[i+1];
arr[i+1] = temp;
}
}
一次循環操作就可以找出數組中的最大值,並將其移動到數組的首位,所以對於一個長度為6的數組,我們只需要進行5(length-1)次上述操作即可將數組降序排序了。
接下來我們進行第二趟循環,求第二大的值,並將其移動到數組的第二個位置。因為我們已經求出了最大值,所以這一次循環,最大值不用參與比較。
代碼實現:

結果:[9, 8, 5, 0, 2, 6]
可以發現經過兩輪循環我們找出了數組中最大的兩個值,並且移動他們到了數組的前兩位。
現在按照上述步驟就可以實現數組的排序了,不過如果我們照搬上述代碼,就會有很多冗余的代碼,所以需要你來改進,怎么改進是需要你思考的。
告訴你一個秘密:使用Arrays.toString(數組)可以直接輸出數組中的值哦!
如下:

輸出結果:[6, 5, 8, 0, 2, 9]
思考題
本關所講述的選擇排序是一個簡化版本,如果你想要學習優化版可以根據下列圖片,編寫出相應代碼,然后在評論區貼出來哦。

上圖就是一個使用選擇排序將一個數組中數據從小到大排序的過程,請思考如何用代碼實現上述過程。
原理:每一次從待排序的數據元素中選出最小的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。
本關難度較大,但這是學習數組繞不過去的一關,多思考,多嘗試,你能成功的,加油!
編程要求
在右側Begin-End區域中添加代碼,實現對數組arr的降序排序,並輸出排序后的arr數組。
測試說明
我會對你的程序進行測試;
預期輸入:6,6,5,0,2,8,9
預期輸出:[9, 8, 6, 5, 2, 0]
預期輸入:4,3,12,1,13
預期輸出:[13, 12, 3, 1]
實現代碼
package step4;
import java.util.Arrays;
import java.util.Scanner;
public class HelloWorld {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//動態創建數組
int[] arr = new int[sc.nextInt()];
for(int i = 0 ; i< arr.length ; i++){
arr[i] = sc.nextInt();
}
/********** Begin **********/
for(int i=0; i<arr.length-1; i++){
//int max = arr[i];
for(int j=i+1; j<arr.length; j++){
if(arr[i] < arr[j]){
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
/* 網上找的
for(int i=0; i<arr.length-1; i++){
for(int j=i+1; j<arr.length; j++){
if(arr[i] < arr[j]){
int c = arr[i];
arr[i] = arr[j];
arr[j] = c;
}
}
}*/
System.out.println(Arrays.toString(arr));
/********** End **********/
}
}
實驗分析
- 直接輸出數組,使用
Arrays.toString(數組)
System.out.println(Arrays.toString(arr)); - 選擇排序(降序)
第一次大循環,將數組的第一個數與后面的所有數比較(進行內層循環),循環次數為length-1(兩個數比較,循環1次,三個數比較,循環兩次,以此類推),將最大值放在第一個數位置上;
第二次大循環,將數組的第二個數與后面的所有數比較(進行內層循環),將最大值放在第一個數位置上
內層循環,循環次數和外層循環相同。都是
length-1()。比較的是第i個數和第i+1個數
第5關:冒泡排序
任務描述
本關任務:使用冒泡排序實現數組的升序排序(從小到大)。
相關知識
冒泡排序

看完上圖,相信你已經能明白冒泡排序的原理了。
將序列當中的左右元素,依次比較,如果左邊的元素大於右邊元素則交換位置,保證右邊的元素始終大於左邊的元素;( 第一輪結束后,序列最后一個元素一定是當前序列的最大值;)對序列當中剩下的n-1個元素再次執行步驟1。對於長度為n的序列,一共需要執行n-1輪比較。
在代碼中實現一輪比較:

輸出結果:[5, 8, 0, 2, 6, 9]
編程要求
在編輯器Begin-end處填充代碼,使用冒泡排序對數組arr進行升序排序,最后輸出排序之后數組arr中的數據。
測試說明
預期輸入:6,9,5,8,0,2,6
預期輸出:[0, 2, 5, 6, 8, 9]
預期輸入:4,3,12,13,0
預期輸出:[0, 3, 12, 13]
實現代碼
package step5;
import java.util.Arrays;
import java.util.Scanner;
public class HelloWorld {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//動態創建數組
int[] arr = new int[sc.nextInt()];
for(int i = 0 ; i< arr.length ; i++){
arr[i] = sc.nextInt();
}
/********** Begin **********/
for(int i=0; i<arr.length-1; i++){
for(int j=0; j<arr.length-i-1; j++){
if(arr[j] > arr[j+1]){
int temp;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
/********** End **********/
}
}
實驗總結
- 冒泡排序,每一次都是相鄰的兩個數(j增加)在比較。且每一遍(i增加)比之前少比較一次,因為最后面的已經比較出來,不需要再比較了。
