מציאת מיני / מקס במערך עם Java

1. הקדמה

במדריך קצר זה, נראה כיצד למצוא את המקסימום ואת הערכים המינימליים במערך, באמצעות Java 8 זרם ממשק API.

נתחיל במציאת המינימום במערך שלם של מספרים, ואז נמצא את המקסימום במערך של אובייקטים.

2. סקירה כללית

ישנן דרכים רבות למצוא את הערך המינימלי או המקסימלי במערך לא מסודר, וכולן נראות בערך כמו:

הגדר מקס למערך [0] עבור i = 1 לאורך המערך - 1 IF מערך [i]> MAX ואז הגדר מקס למערך [i] ENDIF ENDFOR

אנחנו הולכים לבדוק איך Java 8 יכול להסתיר מאיתנו את הפרטים האלה. אך, במקרים בהם ה- API של Java אינו מתאים לנו, אנו תמיד יכולים לחזור לאלגוריתם הבסיסי הזה.

מכיוון שאנחנו צריכים לבדוק כל ערך במערך, כל היישומים הם עַל).

3. מציאת הערך הקטן ביותר

ה java.util.stream.IntStream ממשק מספק את דקה שיטה שיעבוד בסדר גמור למטרות שלנו.

מכיוון שאנחנו עובדים רק עם מספרים שלמים, דקה אינו דורש משווה:

@ מבחן ציבורי בטל כאשר ArrayIsOfIntegerThenMinUsesIntegerComparator () {int [] מספרים שלמים = int int [] {20, 98, 12, 7, 35}; int min = Arrays.stream (מספרים שלמים) .min () .getAsInt (); assertEquals (7, min); }

שימו לב איך יצרנו את מספר שלם הזרם אובייקט באמצעות זרם שיטה סטטית ב מערכים. יש שווה ערך זרם שיטות לכל סוג מערך פרימיטיבי.

מכיוון שהמערך יכול להיות ריק, דקה מחזירה אופציונאלי, אז להמיר את זה ל- int, אנו משתמשים getAsInt.

4. מציאת האובייקט המותאם אישית הגדול ביותר

בואו ליצור POJO פשוט:

רכב ברמה ציבורית {מודל מחרוזת פרטי; פרטי int topSpeed; // קונסטרוקציות סטנדרטיות, קבוצות וקובעות}

ואז נוכל להשתמש ב- זרם API שוב כדי למצוא את המכונית המהירה ביותר במערך אוטוs:

@ מבחן ציבורי בטל כאשר ArrayIsOfCustomTypeThenMaxUsesCustomComparator () {פורשה לרכב = רכב חדש ("פורשה 959", 319); פרארי לרכב = רכב חדש ("פרארי 288 GTO", 303); בוגאטי לרכב = מכונית חדשה ("בוגאטי וויירון 16.4 סופר ספורט", 415); רכב mLLaren = רכב חדש ("מקלארן F1", 355); מכונית [] fastCars = {porsche, ferrari, bugatti, mcLaren}; רכב maxBySpeed ​​= Arrays.stream (fastCars) .max (Comparator.comparing (Car :: getTopSpeed)) .orElseThrow (NoSuchElementException :: new); assertEquals (bugatti, maxBySpeed); }

במקרה זה, השיטה הסטטית זרם שֶׁל מערכים מחזיר מופע של הממשק java.util.stream.Stream איפה השיטה מקסימום דורש א משווה.

יכולנו לבנות את המנהג שלנו משווה, אבל Comparator. השוואה הוא הרבה יותר קל.

שים לב שוב מקסימום מחזירה אופציונאלי למשל מאותה סיבה כמו בעבר.

אנחנו יכולים גם לקבל את הערך הזה, או שאנחנו יכולים לעשות עם כל מה שאפשר אופציונאליs, כמו orElseTrow שזורק חריג אם מקסימום לא מחזיר ערך.

5. מסקנה

ראינו במאמר קצר זה כמה קל וקומפקטי למצוא מקסימום ומינימום במערך באמצעות ה- זרם ממשק API של Java 8.

למידע נוסף על ספריה זו עיין בתיעוד של Oracle.

ניתן למצוא את היישום של כל הדוגמאות וקטעי הקוד ב- GitHub.