Modulo Operator u Javi

1. Pregled

U ovom kratkom uputstvu pokazat ćemo što je modulo operator i kako ga možemo koristiti s Javom za neke uobičajene slučajeve upotrebe.

2. Operator Modulo

Krenimo s nedostacima jednostavne podjele u Javi.

Ako operandi s obje strane operatora dijeljenja imaju tip int, rezultat operacije je drugi int:

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

Ista podjela daje nam drugačiji rezultat kada barem jedan od operanda ima tip plutati ili dvostruko:

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

Možemo primijetiti da pri dijeljenju cijelih brojeva izgubimo ostatak operacije dijeljenja.

Operator modula daje nam točno ovaj ostatak:

@Test javna praznina kadaModulo_thenReturnsRemainder () {assertThat (11% 4) .isEqualTo (3); }

Ostatak je ono što ostaje nakon dijeljenja 11 (dividenda) s 4 (djelitelj) - u ovom slučaju 3.

Iz istog razloga dijeljenje s nulom nije moguće, nije moguće koristiti modulo operator kada je argument desne strane nula.

I podjela i modulo operacija bacaju ArithmeticException kada pokušavamo koristiti nulu kao desni bočni operand:

@Test (očekuje se = ArithmeticException.class) javna praznina kadaDivisionByZero_thenArithmeticException () {dvostruki rezultat = 1/0; } @Test (očekuje se = ArithmeticException.class) javna praznina kadaModuloByZero_thenArithmeticException () {dvostruki rezultat = 1% 0; }

3. Slučajevi uobičajene upotrebe

Najčešći slučaj upotrebe modulo operatora je utvrđivanje je li zadani broj neparan ili paran.

Ako je ishod modularne operacije između bilo kojeg broja i dva jednak jednom, to je neparan broj:

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

S druge strane, ako je rezultat nula (tj. Nema ostatka), to je paran broj:

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

Još jedna dobra upotreba modulo operacije je praćenje indeksa sljedećeg slobodnog mjesta u kružnom nizu.

U jednostavnoj provedbi kružnog reda za int vrijednosti, elementi se čuvaju u polju fiksne veličine.

Kad god želimo gurnuti element u naš kružni red, samo izračunavamo sljedeću slobodnu poziciju izračunavanjem modula broja stavki koje smo već umetnuli plus 1 i kapaciteta reda:

@Test public void whenItemsIsAddedToCircularQueue_thenNoArrayIndexOutOfBounds () {int QUEUE_CAPACITY = 10; int [] circularQueue = novo int [QUEUE_CAPACITY]; int itemsInserted = 0; za (int vrijednost = 0; vrijednost <1000; vrijednost ++) {int writeIndex = ++ itemsInserted% QUEUE_CAPACITY; circularQueue [writeIndex] = vrijednost; }}

Korištenjem operatora modulo spriječavamo writeIndex da bismo ispali iz granica niza, dakle, nikada nećemo dobiti ArrayIndexOutOfBoundsException.

Međutim, nakon što umetnemo više od QUEUE_CAPACITY stavke, sljedeća će stavka prebrisati prvu.

4. Zaključak

Operator modula koristi se za izračunavanje ostatka cjelobrojne podjele koja se inače izgubila.

Korisno je raditi jednostavne stvari poput utvrđivanja je li zadani broj paran ili neparan, kao i složenije zadatke poput praćenja sljedećeg položaja pisanja u kružnom nizu.

Primjer koda dostupan je u spremištu GitHub.