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.