מפעיל המודולו בג'אווה

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

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

2. מפעיל המודולו

נתחיל בחסרונות של חלוקה פשוטה בג'אווה.

אם לאופרטים משני צידי מפעיל החלוקה יש סוג int, תוצאת הפעולה היא אחרת int:

@ מבחן ציבורי בטל כאשרIntegerDivision_thenLosesRemainder () {assertThat (11/4) .isEqualTo (2); }

אותה חלוקה נותנת לנו תוצאה אחרת כאשר לפחות לאחד האופרטים יש סוג לָצוּף אוֹ לְהַכפִּיל:

@Test הציבור בטל כאשר DoubleDivision_thenKeepsRemainder () {assertThat (11 / 4.0) .isEqualTo (2.75); }

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

מפעיל המודולו נותן לנו בדיוק את השארית הזו:

@Test הציבור בטל כאשרModulo_thenReturnsRemainder () {assertThat (11% 4) .isEqualTo (3); }

השאר הוא מה שנשאר לאחר חלוקה של 11 (הדיבידנד) ב- 4 (המחלק) - במקרה זה, 3.

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

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

@Test (צפוי = ArithmeticException.class) בטל בציבור כאשר DivisionByZero_thenArithmeticException () {תוצאה כפולה = 1/0; } @Test (צפוי = ArithmeticException.class) בטל בציבור כאשרModuloByZero_thenArithmeticException () {תוצאה כפולה = 1% 0; }

3. מקרי שימוש נפוצים

מקרה השימוש הנפוץ ביותר עבור מפעיל המודולו הוא לברר אם מספר נתון הוא אי זוגי או זוגי.

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

@ מבחן ציבורי בטל כאשר DivisorIsOddAndModulusIs2_thenResultIs1 () {assertThat (3% 2) .isEqualTo (1); }

מצד שני, אם התוצאה היא אפס (כלומר אין שארית), זה מספר זוגי:

@Test הציבור בטל כאשר DivisorIsEvenAndModulusIs2_thenResultIs0 () {assertThat (4% 2) .isEqualTo (0); }

שימוש טוב נוסף בפעולת המודולו הוא מעקב אחר אינדקס הנקודה החופשית הבאה במערך מעגלי.

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

בכל פעם שאנחנו רוצים לדחוף אלמנט לתור המעגלי שלנו, אנחנו פשוט מחשבים את המיקום החופשי הבא על ידי חישוב המודול של מספר הפריטים שכבר הכנסנו בתוספת 1 ואת קיבולת התור:

@Test הציבור בטל כאשרItemsIsAddedToCircularQueue_thenNoArrayIndexOutOfBounds () {int QUEUE_CAPACITY = 10; int [] circularQueue = int int [QUEUE_CAPACITY]; int itemsInserted = 0; עבור (int ערך = 0; ערך <1000; ערך ++) {int writeIndex = ++ פריטים הוזן% QUEUE_CAPACITY; circularQueue [writeIndex] = ערך; }}

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

עם זאת, ברגע שאנחנו מכניסים יותר מ QUEUE_CAPACITY פריטים, הפריט הבא יחליף את הראשון.

4. מסקנה

אופרטור המודולו משמש לחישוב שארית חלוקה שלמה שאיבדה אחרת.

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

קוד הדוגמה זמין במאגר GitHub.