A Modulo Operator Java-ban
1. Áttekintés
Ebben a rövid bemutatóban megmutatjuk, mi a modulo operátor, és hogyan tudjuk használni a Java-val néhány gyakori használatra.
2. A Modulo Operator
Kezdjük a Java egyszerű felosztásának hiányosságaival.
Ha az osztási operátor mindkét oldalán található operandusoknak van típusa int, a művelet eredménye egy másik int:
@Test public void whenIntegerDivision_thenLosesRemainder () {assertThat (11/4) .isEqualTo (2); }
Ugyanaz a felosztás más eredményt ad nekünk, ha legalább az egyik operandusnak típusa van úszó vagy kettős:
@Test public void whenDoubleDivision_thenKeepsRemainder () {assertThat (11 / 4.0) .isEqualTo (2.75); }
Megfigyelhetjük, hogy az osztási művelet fennmaradó részét elveszítjük egész számok felosztásakor.
A modulo operátor pontosan ezt a maradékot adja meg nekünk:
@Test public void whenModulo_thenReturnsRemainder () {assertThat (11% 4) .isEqualTo (3); }
A maradék az, ami megmarad, miután elosztjuk a 11-et (az osztalékot) 4-gyel (osztóval) - ebben az esetben 3-mal.
Ugyanezen okból a nullával való felosztás nem lehetséges, ezért nem lehet használni a modulo operátort, ha a jobb oldali argumentum nulla.
Mind a felosztás, mind a modulo művelet an-t dob Számtani kivétel amikor a nullát próbáljuk használni jobb oldali operandusként:
@Test (várható = ArithmeticException.class) public void mikorDivisionByZero_thenArithmeticException () {kettős eredmény = 1/0; } @Test (várható = ArithmeticException.class) public void mikorModuloByZero_thenArithmeticException () {kettős eredmény = 1% 0; }
3. Közös használatú esetek
A modulo operátor leggyakoribb használati esete annak kiderítése, hogy egy adott szám páratlan vagy páros-e.
Ha bármelyik és kettő közötti modulo művelet eredménye egyenlő eggyel, akkor ez páratlan szám:
@Test public void whenDivisorIsOddAndModulusIs2_thenResultIs1 () {assertThat (3% 2) .isEqualTo (1); }
Másrészt, ha az eredmény nulla (azaz nincs maradék), akkor ez páros szám:
@Test public void whenDivisorIsEvenAndModulusIs2_thenResultIs0 () {assertThat (4% 2) .isEqualTo (0); }
A modulo művelet másik jó felhasználása, hogy nyomon követjük a következő szabad folt indexét egy kör alakú tömbben.
A kör alakú sor egyszerű megvalósításában int értékek, az elemeket rögzített méretű tömbben tartják.
Bármikor el akarunk tolni egy elemet a körös sorunkba, csak kiszámoljuk a következő szabad pozíciót a már beillesztett tételek számának modulusának plusz 1 és a várakozási képesség kiszámításával:
@Test public void whenItemsIsAddedToCircularQueue_thenNoArrayIndexOutOfBounds () {int QUEUE_CAPACITY = 10; int [] circularQueue = új int [QUEUE_CAPACITY]; int itemInserted = 0; for (int érték = 0; érték <1000; érték ++) {int writeIndex = ++ itemsInserted% QUEUE_CAPACITY; circularQueue [writeIndex] = érték; }}
A modulo operátor használatával megakadályozzuk writeIndex hogy kijussunk a tömb határain, ezért soha nem fogunk egy ArrayIndexOutOfBoundsException.
Azonban ha egyszer többet illesztünk be QUEUE_CAPACITY elemeket, a következő elem felülírja az elsőt.
4. Következtetés
A modulo operátor az egész veszteség maradékának kiszámítására szolgál, amely egyébként elveszett.
Hasznos egyszerű dolgokat megtenni, például kitalálni, hogy egy adott szám páros-e vagy páratlan, valamint olyan bonyolultabb feladatokat is, mint például a következő írási pozíció követése egy kör alakú tömbben.
A példakód a GitHub adattárban érhető el.