educoder---Java入門-數組進階


第1關:數組的復制

任務描述

本關任務:完成將一個數組的值復制給另一個數組。

相關知識

本關需要你完成數組的復制操作,可以分三個步驟來實現。

  1. 創建一個數組arr2,數組長度和數組arr1相同;
  2. 使用循環將數組1中的每一個數據賦值給數組2中對應的那一項。(即arr2[0] = arr1[0]);
  3. 循環輸出復制之后arr2中的所有數據。

編程要求

在右側編輯器Begin-End中填充代碼,將arr1數組中的數據全部復制給arr2數組,最后輸出arr2中所有的數據。
3## 測試說明
我會對你的程序進行測試,如下:
測試輸入:1312
預期輸出:
1
3
12
測試輸入:21311
預期輸出:
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 **********/
	}
}

實驗分析

  1. ==比較的是兩個對象的內存地址。如果不創建對象,則兩個變量同時指向一個對象,內存地址相同;如果創建對象,則指向兩個不同的對象,內存地址不同。
  2. 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 **********/
	}
}

實驗分析

  1. 直接輸出數組,使用Arrays.toString(數組)
    System.out.println(Arrays.toString(arr));
  2. 選擇排序(降序)
    第一次大循環,將數組的第一個數與后面的所有數比較(進行內層循環),循環次數為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 **********/
	}
}	

實驗總結

  1. 冒泡排序,每一次都是相鄰的兩個數(j增加)在比較。且每一遍(i增加)比之前少比較一次,因為最后面的已經比較出來,不需要再比較了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM