מערכים

מה זה מערך?

מערך (array) הוא אוסף של ערכים מאותו טיפוס, מאוחסנים בזיכרון רציף. הגישה לערך במערך היא מיידית דרך אינדקס (מיקום).

חשוב לזכור: מערכים ב-Java הם באורך קבוע. אחרי שיצרת מערך בגודל 10, לא ניתן להגדיל אותו.

הכרזה ויצירה

הכרזה

int[] numbers;    // מומלץ
// או
int numbers[];    // חוקי אבל פחות נפוץ

יצירה - גודל ידוע

int[] numbers = new int[5];

נוצר מערך באורך 5, כל התאים מאותחלים ל-0 (ברירת מחדל של int).

יצירה - עם ערכים

int[] numbers = {10, 20, 30, 40, 50};

או בצורה המלאה:

int[] numbers = new int[]{10, 20, 30, 40, 50};

גישה לאיברים

int[] numbers = {10, 20, 30, 40, 50};

int first = numbers[0];    // 10
int last = numbers[4];     // 50

numbers[2] = 99;           // שינוי ערך

זכרו: האינדקס הראשון הוא 0, לא 1! מערך בגודל 5 יש לו אינדקסים 0, 1, 2, 3, 4.

אורך המערך

int[] numbers = {10, 20, 30};
int len = numbers.length;    // 3

שימו לב: length הוא שדה (בלי סוגריים), בניגוד למחרוזת שבה length() הוא פונקציה.

מעבר על מערך

עם for רגיל

int[] numbers = {10, 20, 30, 40, 50};

for (int i = 0; i < numbers.length; i++) {
    System.out.println(numbers[i]);
}

עם for-each

for (int n : numbers) {
    System.out.println(n);
}

ArrayIndexOutOfBoundsException

אם תנסו לגשת לאינדקס מחוץ לתחום - תקבלו חריגה:

int[] numbers = {1, 2, 3};
int x = numbers[5];   // ArrayIndexOutOfBoundsException!

ברירות מחדל

כשיוצרים מערך עם new, התאים מקבלים ערכי ברירת מחדל:

טיפוס ברירת מחדל
int, long, short, byte 0
float, double 0.0
char '\u0000'
boolean false
אובייקטים (String וכו') null

מערך של מחרוזות

String[] names = {"אורי", "דוד", "רחל"};
System.out.println(names[0]);   // אורי

מערכים דו-ממדיים

מערך של מערכים - שימושי לטבלאות, לוחות משחק וכו':

הכרזה

int[][] matrix = new int[3][4];   // 3 שורות, 4 עמודות

עם ערכים

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

גישה

int cell = matrix[1][2];    // 6 (שורה 1, עמודה 2)
matrix[0][0] = 100;

מעבר על מערך דו-ממדי

for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        System.out.print(matrix[i][j] + " ");
    }
    System.out.println();
}

או עם for-each:

for (int[] row : matrix) {
    for (int value : row) {
        System.out.print(value + " ");
    }
    System.out.println();
}

מחלקת Arrays - פעולות שימושיות

import java.util.Arrays;

int[] numbers = {5, 2, 8, 1, 9};

// מיון
Arrays.sort(numbers);             // {1, 2, 5, 8, 9}

// הדפסה
System.out.println(Arrays.toString(numbers));  // [1, 2, 5, 8, 9]

// מילוי
int[] zeros = new int[10];
Arrays.fill(zeros, 0);

// העתקה
int[] copy = Arrays.copyOf(numbers, numbers.length);
int[] partial = Arrays.copyOfRange(numbers, 1, 4);

// השוואה
boolean equal = Arrays.equals(numbers, copy);

דוגמה: מציאת המספר הגדול ביותר

int[] numbers = {23, 45, 12, 67, 34, 89, 5};
int max = numbers[0];

for (int i = 1; i < numbers.length; i++) {
    if (numbers[i] > max) {
        max = numbers[i];
    }
}

System.out.println("הגדול ביותר: " + max);

דוגמה: היפוך מערך

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

for (int i = 0; i < numbers.length / 2; i++) {
    int temp = numbers[i];
    numbers[i] = numbers[numbers.length - 1 - i];
    numbers[numbers.length - 1 - i] = temp;
}

System.out.println(Arrays.toString(numbers));  // [5, 4, 3, 2, 1]

בדקו את עצמכם

נסו לענות לבד לפני שאתם פותחים את התשובה.

  1. מה האינדקס של האיבר האחרון במערך בגודל 5?

    1. 5
    2. 4
    3. 0
    4. -1
    הצגת התשובה

    תשובה ב. האינדקסים מתחילים ב-0, ולכן במערך בגודל 5 הם 0 עד 4.

  2. איך מקבלים את אורך המערך arr?

    1. arr.size()
    2. length(arr)
    3. arr.length()
    4. arr.length
    הצגת התשובה

    תשובה ד. length במערך הוא שדה, בלי סוגריים. ב-String זו מתודה: length().

  3. מה קורה כשניגשים ל-arr[10] במערך בגודל 5?

    1. מקבלים null
    2. המערך גדל אוטומטית
    3. מקבלים 0
    4. נזרקת ArrayIndexOutOfBoundsException
    הצגת התשובה

    תשובה ד. Java בודקת גבולות בזמן ריצה וזורקת חריגה על אינדקס לא חוקי.