למה שני מעברים?

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

  1. מעבר ראשון – ספירת האיברים שעומדים בתנאי (כדי לדעת את גודל המערך החדש).
  2. מעבר שני – יצירת המערך בגודל המתאים ומילויו באיברים.

התבנית הכללית

public static int[] filterByCondition(int[] arr) {
    // מעבר 1: ספירה
    int count = 0;
    for (int i = 0; i < arr.length; i++) {
        if (/* תנאי */)
            count++;
    }

    // יצירת מערך חדש
    int[] result = new int[count];

    // מעבר 2: מילוי
    int index = 0;
    for (int i = 0; i < arr.length; i++) {
        if (/* אותו תנאי */) {
            result[index] = arr[i];
            index++;
        }
    }
    return result;
}

דוגמה 1: סינון מספרים זוגיים

public static int[] getEvens(int[] arr) {
    int count = 0;
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] % 2 == 0)
            count++;
    }

    int[] evens = new int[count];
    int idx = 0;
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] % 2 == 0) {
            evens[idx] = arr[i];
            idx++;
        }
    }
    return evens;
}

עבור {3, 8, 1, 4, 7, 2} → יוחזר {8, 4, 2}.

דוגמה 2: סינון ציונים מעל ממוצע

public static int[] aboveAverage(int[] grades) {
    // חישוב ממוצע
    double sum = 0;
    for (int i = 0; i < grades.length; i++)
        sum += grades[i];
    double avg = sum / grades.length;

    // ספירה
    int count = 0;
    for (int i = 0; i < grades.length; i++) {
        if (grades[i] > avg)
            count++;
    }

    // מילוי
    int[] result = new int[count];
    int idx = 0;
    for (int i = 0; i < grades.length; i++) {
        if (grades[i] > avg) {
            result[idx] = grades[i];
            idx++;
        }
    }
    return result;
}

טעויות נפוצות

  • שכחת משתנה index – שימוש ב-i במקום index נפרד למערך החדש יגרום לדריסת תאים או לאינדקס לא חוקי.
  • תנאי שונה בשני המעברים – חובה שהתנאי יהיה זהה בספירה ובמילוי.
  • שכחת הגדלת index – אם שוכחים index++, כל האיברים יכתבו לתא [0].

שאלות נפוצות

למה לא פשוט ליצור מערך בגודל המקורי?

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

מה אם התנאי מורכב?

אפשר לכתוב פעולת עזר (helper method) שמקבלת ערך ומחזירה boolean, ואז להשתמש בה בשני המעברים.

אפשר בלי שני מעברים בכלל?

כן, עם ArrayList שגודלו דינמי. אבל בבגרות בדרך כלל עובדים עם מערכים רגילים, ולכן שני מעברים הם הפתרון הנכון.

צריכים עזרה במערכים?

מורים פרטיים ילמדו אתכם דפוסי תכנות ותרגילי בגרות.

מצאו מורה פרטי