JavaRush /Java Blog /Random-TW /Arrays類別及其用法

Arrays類別及其用法

在 Random-TW 群組發布
再一次問好!:) 在上一課中,我們熟悉了數組(Java數組)這樣的數據結構,學習瞭如何創建數組、向數組填充數據,還學習了它們如何在內存中存儲。今天我們將討論一些在實際工作中經常遇到的任務和使用陣列的範例。例如,想像一下這種情況:我們有一個以隨機順序寫入的 10 個數字組成的陣列。
//array Java, example
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
我們的任務是按升序對這個陣列進行排序:從最小到最大的數字。最後它應該看起來像這樣:
[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
我們如何做到這一點?這項任務並不簡單,我們以前從未這樣做過:/有什麼想法嗎?猜猜看。例如,我們可以這樣做:
  • 迭代數組的所有元素。將每個元素與下一個元素進行比較([0]with [1][1]with [2][2]with[3]等)。如果目前陣列元素大於下一個元素,則交換它們並繼續處理下一個元素。如果沒有,請保持原樣並繼續。

  • 因此,在第一次遍歷陣列元素後,保證最大值 (167) 位於最後一個儲存格中。

  • 現在,讓我們再次遍歷數組的所有元素,從索引為的元素開始[0],直到倒數第二個元素(最大的數字已經就位)並進行相同的比較和交換。 
    最後,在倒數第二個單元格中,我們將獲得第二高值 (99)。

  • 讓我們重複這項工作,次數與陣列中的元素減一相同。
數組類別及其用法 - 2我們有了這個想法,剩下的就是編寫程式碼了。它看起來像這樣:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       for (int i = numbers.length - 1; i > 0; i--) {
           for (int j = 0; j < i; j++) {
           /* Compare the elements in pairs,
             if they are in the wrong order,
             then swap them */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
嗯...看起來有點複雜-_- 即使大致的操作原理很清楚,你也必須編寫相當多的程式碼才能解決這樣一個看似簡單的任務。好吧,也許我們只是高估了自己?也許,到目前為止,我們所承擔的任務對我們來說太艱鉅了。讓我們嘗試做一些更簡單的事情。例如,讓我們採用相同的數字數組。
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
我們的任務是將其內容複製到另一個陣列。
int [] numbersCopy = new int[10];
考慮一下如何利用已有的陣列知識來做到這一點?例如,您可以循環遍歷數組numbers並將其元素一一寫入numbersCopy
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = new int[10];

       for (int i = 0; i < numbers.length; i++) {

           numbersCopy[i] = numbers[i];
       }

   }
}
好吧,我們或多或少已經做到了!問題似乎已經解決了,但同樣地:如果需要經常執行,程式碼就會有一堆相同的循環。事實上,這些問題和其他問題早已被Java的創建者解決了,我們不需要「重新發明輪子」並為我們自己的解決方案編寫一些程式碼。

Java 數組類

一個特殊的 Java 類別將幫助您解決使用陣列時的典型問題 - Arrays。此類別中新增了方法來解決 Java 程式設計師在工作中遇到的最常見問題。例如,我們自己嘗試提出解決方案的陣列排序任務可以用一行解決:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       Arrays.sort(numbers);

       System.out.println(Arrays.toString(numbers));

   }
}
此方法Arrays.sort()對數組進行排序。此外,其中嵌入的演算法比我們編寫的程式碼更有效率。控制台輸出:

[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
請注意:為了將數組轉換為字串,我們使用了另一個類別方法Arrays- Arrays.toString()Java 數組本身不會覆蓋toString(). 所以如果你只是寫
System.out.println(numbers.toString());
toString()類別 方法將被呼叫Object。對於數組,輸出將如下所示:

[I@4554617c
現在我們不詳細解釋為什麼結論是這樣的,主要是這顯然不是我們需要的。但 Arrays.toString() 做到了我們想要的。順便說一下,我們的複製問題在課堂上也很容易解決Arrays
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
我們向該方法Arrays.copyOf()傳遞原始數組(我們需要從中複製值)以及將資料複製到其中的新數組的長度。在本例中,我們表示為 長度numbers.length,因為 我們想要複製整個陣列。如果我們只想複製前幾個元素,我們可以為新數組指定較小的長度:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, 4);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
這裡我們指定新數組的長度為 4。因此,只有前 4 個元素numbers會被複製到新數組中。控制台輸出:

[167, -2, 16, 99]
順便說一句,如果您需要複製數組的一部分,但不是從頭開始,而是“從中間”,Arrays您也可以這樣做:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
結論:

[16, 99, 26, 92]
儲存格 2(含)到 6(不含) 的數字被複製到新數組中。此外,我們可能需要比較兩個陣列。正如該方法一樣toString(),數組本身不會重寫該方法equals()。因此,如果我們嘗試像這樣比較它們:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(numbers.equals(numbers2));
   }
}
我們得到了結果false。畢竟會呼叫Object.equals()比較連結的方法。當然,它們是不同的!但我們需要比較數組的內容,而不是連結。這個類別Arrays包含一個重寫的方法equals(),它完全滿足我們的需要:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(Arrays.equals(numbers, numbers2));
   }
}
結論:

true
順便說一句,該類別Arrays不僅可以成功地處理普通數組,還可以處理二維數組:
public class Main {

   public static void main(String[] args) {

       int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

       int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);

       System.out.println("Are these two-dimensional arrays equal to each other?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));

       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
結論:

Равны ли эти двумерные массивы между собой?
true
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
正如您所看到的,該方法Arrays.copyOf()處理複製二維數組。請注意,在這種情況下,當複製二維數組時,會發生所謂的「淺複製」。為了比較二維數組並將其輸出到控制台,提供了一種特殊方法 -deepEqualsdeepToString();將來,您將不只一次看到(並為此感到高興)Java 的創建者預見了程式設計師在工作時遇到的許多典型情況,並用該語言為他們實現了現成的解決方案。使用這些解決方案比重新發明輪子更容易、更方便,對吧?:) 請務必閱讀OracleArrays網站上的類別文件。祝你學業順利!
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION