Modulo operátor v Jave

1. Prehľad

V tomto krátkom tutoriáli si ukážeme, čo je to modulo operátor a ako ho môžeme používať s Java na niektoré bežné prípady použitia.

2. Modulo operátor

Začnime s nedostatkami jednoduchého delenia v Jave.

Ak majú operandy na oboch stranách operátora delenia typ int, výsledkom operácie je ďalší int:

@Test public void whenIntegerDivision_thenLosesRemainder () {assertThat (11/4) .isEqualTo (2); }

Rovnaké rozdelenie nám dáva iný výsledok, keď aspoň jeden z operandov má typ plavák alebo dvojitý:

@Test public void whenDoubleDivision_thenKeepsRemainder () {assertThat (11 / 4.0) .isEqualTo (2,75); }

Môžeme pozorovať, že pri delení celých čísel stratíme zvyšok operácie delenia.

Operátor modulo nám dáva presne tento zvyšok:

@Test public void whenModulo_thenReturnsRemainder () {assertThat (11% 4) .isEqualTo (3); }

Zvyšok zostáva po delení 11 (dividenda) 4 (deliteľ) - v tomto prípade 3.

Z rovnakého dôvodu nie je možné delenie nulou, nie je možné použiť operátor modulo, keď je argument na pravej strane nulový.

Delenie aj prevádzka modulo vrhajú Aritmetická výnimka keď sa snažíme použiť nulu ako operand na pravej strane:

@Test (očakáva sa = ArithmeticException.class) public void whenDivisionByZero_thenArithmeticException () {double result = 1/0; } @Test (očakáva sa = ArithmeticException.class) public void whenModuloByZero_thenArithmeticException () {double result = 1% 0; }

3. Prípady bežného použitia

Najbežnejším prípadom použitia pre operátora modulo je zistiť, či je dané číslo nepárne alebo párne.

Ak sa výsledok činnosti modulo medzi ľubovoľným číslom a dvoma rovná jednému, je to nepárne číslo:

@Test public void whenDivisorIsOddAndModulusIs2_thenResultIs1 () {assertThat (3% 2) .isEqualTo (1); }

Na druhej strane, ak je výsledok nulový (t. J. Nezostane žiadny zvyšok), je to párne číslo:

@Test public void whenDivisorIsEvenAndModulusIs2_thenResultIs0 () {assertThat (4% 2) .isEqualTo (0); }

Ďalším dobrým využitím činnosti modulo je sledovanie indexu nasledujúceho voľného miesta v kruhovom poli.

V jednoduchej implementácii kruhového frontu pre int hodnoty, prvky sa uchovávajú v poli pevnej veľkosti.

Kedykoľvek chceme vložiť prvok do našej kruhovej fronty, jednoducho vypočítame ďalšiu voľnú pozíciu vypočítaním modula počtu položiek, ktoré sme už vložili, plus 1 a kapacity frontu:

@Test public void whenItemsIsAddedToCircularQueue_thenNoArrayIndexOutOfBounds () {int QUEUE_CAPACITY = 10; int [] circleQueue = nový int [QUEUE_CAPACITY]; int itemsInserted = 0; for (int value = 0; value <1000; value ++) {int writeIndex = ++ itemsInserted% QUEUE_CAPACITY; circleQueue [writeIndex] = hodnota; }}

Používaniu modulo operátora bránime writeIndex vypadnúť z hranice poľa, preto nikdy nedostaneme ArrayIndexOutOfBoundsException.

Akonáhle však vložíme viac ako QUEUE_CAPACITY nasledujúce položky prepíšu prvé.

4. Záver

Operátor modulo sa používa na výpočet zvyšku celočíselného delenia, ktoré by sa inak stratilo.

Je užitočné robiť jednoduché veci, ako je zisťovanie, či je dané číslo párne alebo nepárne, ako aj zložitejšie úlohy, ako je sledovanie nasledujúcej polohy zápisu v kruhovom poli.

Vzorový kód je k dispozícii v úložisku GitHub.


$config[zx-auto] not found$config[zx-overlay] not found