מיון מערכים בג'אווה

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

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

נבחן שימוש ב- Java מערכים שיטת מיון כיתות וכן יישום משלנו משווה להזמין את ערכי המערכים שלנו.

2. הגדרות אובייקט

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

int [] numbers = int int [] {-8, 7, 5, 9, 10, -2, 3}; String [] strings = new String [] {"learning", "java", "with", "baeldung"};

ובואו גם ליצור מערך של עוֹבֵד חפצים שלכל עובד יש תְעוּדַת זֶהוּת ו שֵׁם תְכוּנָה:

עובד ג'ון = עובד חדש (6, "ג'ון"); עובד מרי = עובד חדש (3, "מרי"); עובד דוד = עובד חדש (4, "דוד"); עובד [] עובדים = עובד חדש [] {ג'ון, מרי, דוד};

3. מיון בסדר עולה

Java util.Arrays.sort השיטה מספקת לנו דרך מהירה ופשוטה למיין מערך של פרימיטיבים או אובייקטים המיישמים את ניתן להשוות ממשק בסדר עולה.

בעת מיון פרימיטיבים, ה- Arrays.sort השיטה משתמשת ביישום כפול ציר של Quicksort. עם זאת, בעת מיון אובייקטים נעשה שימוש ביישום איטרטיבי של MergeSort.

3.1. פרימיטיבים

כדי למיין מערך פרימיטיבי בסדר עולה, אנו מעבירים את המערך שלנו אל ה- סוג שיטה:

Arrays.sort (מספרים); assertArrayEquals (int int [] {-8, -2, 3, 5, 7, 9, 10}, numbers); 

3.2. אובייקטים שמיישמים דומים

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

Arrays.sort (מחרוזות); assertArrayEquals (מחרוזת חדשה [] {"baeldung", "java", "learning", "with"}, strings);

3.3. אובייקטים שאינם מיישמים דומים

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

אנו יכולים לעשות זאת בקלות רבה ב- Java 8 על ידי ציון המאפיין אותו נרצה להשוות עוֹבֵד אובייקטים בתוך שלנו משווה:

Arrays.sort (עובדים, Comparator.comparing (עובד :: getName)); assertArrayEquals (עובד חדש [] {דוד, ג'ון, מרי}, עובדים);

במקרה זה, צייננו כי נרצה להזמין את העובדים שלנו לפי שלהם שֵׁם תכונות.

אנו יכולים גם למיין את האובייקטים שלנו על מאפיין אחד יותר על ידי שרשור ההשוואות שלנו באמצעות ההשוואה של ההשוואה אז שיטה:

Arrays.sort (עובדים, Comparator.comparing (עובד :: getName) .thenComparing (עובד :: getId));

4. מיון בסדר יורד

4.1. פרימיטיבים

מיון מערך פרימיטיבי בסדר יורד אינו פשוט כמו מיון בסדר עולה מכיוון שג'אווה אינה תומכת בשימוש ב- משווים על סוגים פרימיטיביים. כדי להתגבר על המחסור הזה יש לנו כמה אפשרויות.

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

שנית, יכול להמיר את המערך שלנו לרשימה, השתמשו בגויאבה Lists.reverse () שיטה ואז להמיר את הרשימה בחזרה למערך.

לבסוף נוכל להפוך את המערך שלנו ל- זרם ואז למפות אותו בחזרה ל- int מַעֲרָך. יש לזה יתרון נחמד של להיות קו אחד ומשתמש רק בג'אווה של ליבת:

מספרים = IntStream.of (מספרים) .boxed (). ממוינים (Comparator.reverseOrder ()). mapToInt (i -> i) .toArray (); assertArrayEquals (int int [] {10, 9, 7, 5, 3, -2, -8}, numbers);

הסיבה שזה עובד היא ש מוסגר הופך כל אחד int לתוך מספר שלם, איזה עושה ליישם משווה.

4.2. אובייקטים המיישמים דומים

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

ב- Java 8 נוכל להשתמש Comparator.reverseOrder () כדי לציין שאנחנו רוצים שמערך שלנו ימוין בסדר יורד:

Arrays.sort (מחרוזות, Comparator.reverseOrder ()); assertArrayEquals (מחרוזת חדשה [] {"עם", "למידה", "java", "baeldung"}, מחרוזות);

4.3. אובייקטים שאינם מיישמים דומים

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

Arrays.sort (עובדים, Comparator.comparing (עובד :: getName). הפוך ()); assertArrayEquals (עובד חדש [] {מרי, ג'ון, דוד}, עובדים);

5. מסקנה

במאמר זה דנו כיצד למיין מערכים של פרימיטיבים וחפצים בסדר עולה ויורד באמצעות ה- Arrays.sort שיטה.

כרגיל, ניתן למצוא את קוד המקור ממאמר זה ב- Github.