Porovnanie dvoch HashMaps v Jave

1. Prehľad

V tomto návode preskúmame rôzne spôsoby, ako porovnať dva HashMaps v Jave.

Budeme diskutovať o viacerých spôsoboch kontroly, či sú dva HashMaps sú si podobné. Na získanie podrobných rozdielov medzi rôznymi spôsobmi tiež použijeme rozhranie Java 8 Stream API a Guava HashMaps.

2. Pomocou Map.equals ()

Najprv použijeme Map.equals () skontrolovať, či sú dve HashMaps majú rovnaké záznamy:

@Test public void whenCompareTwoHashMapsUsingEquals_thenSuccess () {Map asiaCapital1 = new HashMap (); asiaCapital1.put ("Japonsko", "Tokio"); asiaCapital1.put ("Južná Kórea", "Soul"); Mapa asiaCapital2 = nový HashMap (); asiaCapital2.put ("Južná Kórea", "Soul"); asiaCapital2.put ("Japonsko", "Tokio"); Mapa asiaCapital3 = nový HashMap (); asiaCapital3.put ("Japonsko", "Tokio"); asiaCapital3.put ("Čína", "Peking"); assertTrue (asiaCapital1.equals (asiaCapital2)); assertFalse (asiaCapital1.equals (asiaCapital3)); }

Tu vytvárame tri HashMap objekty a pridávanie záznamov. Potom používame Map.equals () skontrolovať, či sú dve HashMaps majú rovnaké záznamy.

Takýmto spôsobom Map.equals () funguje porovnaním kľúčov a hodnôt pomocou Object.equals () metóda. To znamená, že funguje, iba keď sú implementované kľúčové aj hodnotné objekty rovná sa () správne.

Napríklad, Map.equals () nefunguje, keď je typom hodnoty pole ako pole rovná sa () metóda porovnáva identitu a nie obsah poľa:

@Test public void whenCompareTwoHashMapsWithArrayValuesUsingEquals_thenFail () {Map asiaCity1 = new HashMap (); asiaCity1.put ("Japonsko", nový reťazec [] {"Tokio", "Osaka"}); asiaCity1.put ("Južná Kórea", nový reťazec [] {"Soul", "Pusan"}); Mapa asiaCity2 = nový HashMap (); asiaCity2.put ("Južná Kórea", nový reťazec [] {"Soul", "Pusan"}); asiaCity2.put ("Japonsko", nový reťazec [] {"Tokio", "Osaka"}); assertFalse (asiaCity1.equals (asiaCity2)); }

3. Používanie Java Prúd API

Môžeme tiež implementovať vlastnú metódu na porovnanie HashMaps pomocou Java 8 Prúd API:

private boolean areEqual (Mapa ako prvá, Mapa ako druhá) {if (first.size ()! = second.size ()) {return false; } return first.entrySet (). stream () .allMatch (e -> e.getValue (). equals (second.get (e.getKey ()))); }

Pre jednoduchosť sme implementovali areEqual () metóda, ktorú teraz môžeme použiť na porovnanie HashMap objekty:

@Test public void whenCompareTwoHashMapsUsingStreamAPI_thenSuccess () {assertTrue (areEqual (asiaCapital1, asiaCapital2)); assertFalse (areEqual (asiaCapital1, asiaCapital3)); }

Môžeme si však prispôsobiť aj našu vlastnú metódu areEqualWithArrayValue () na spracovanie hodnôt poľa pomocou Polia.equals () na porovnanie dvoch polí:

private boolean areEqualWithArrayValue (Mapa ako prvá, Mapa ako druhá) {if (first.size ()! = second.size ()) {return false; } návrat first.entrySet (). stream () .allMatch (e -> Arrays.equals (e.getValue (), second.get (e.getKey ()))); }

Na rozdiel od Map.equals (), bude naša vlastná metóda úspešne porovnaná HashMaps s hodnotami poľa:

@Test public void whenCompareTwoHashMapsWithArrayValuesUsingStreamAPI_thenSuccess () {assertTrue (areEqualWithArrayValue (asiaCity1, asiaCity2)); assertFalse (areEqualWithArrayValue (asiaCity1, asiaCity3)); }

4. Porovnávanie HashMap Kľúče a hodnoty

Ďalej sa pozrime, ako porovnať dve HashMap kľúče a ich zodpovedajúce hodnoty.

4.1. Porovnávanie HashMap Kľúče

Najskôr môžeme skontrolovať, či sú dve HashMaps majú rovnaké kľúče iba porovnaním ich KeySet ():

@Test public void whenCompareTwoHashMapKeys_thenSuccess () {assertTrue (asiaCapital1.keySet (). Equals (asiaCapital2.keySet ())); assertFalse (asiaCapital1.keySet (). rovná sa (asiaCapital3.keySet ())); }

4.2. Porovnávanie HashMap Hodnoty

Ďalej uvidíme, ako to porovnať HashMap hodnoty jeden po druhom.

Implementujeme jednoduchú metódu na kontrolu, ktoré kľúče majú v oboch rovnaké hodnoty HashMaps použitím Prúd API:

súkromné ​​mapy areEqualKeyValues ​​(Mapa ako prvá, Mapa ako druhá) {return first.entrySet (). stream () .collect (Collectors.toMap (e -> e.getKey (), e -> e.getValue (). rovná sa (druhá. get (e.getKey ())))); }

Teraz môžeme použiť areEqualKeyValues ​​() na porovnanie dvoch rôznych HashMaps podrobne zistiť, ktoré kľúče majú rovnakú hodnotu a ktoré majú odlišné hodnoty:

@Test public void whenCompareTwoHashMapKeyValuesUsingStreamAPI_thenSuccess () {Map asiaCapital3 = new HashMap (); asiaCapital3.put ("Japonsko", "Tokio"); asiaCapital3.put ("Južná Kórea", "Soul"); asiaCapital3.put ("Čína", "Peking"); Mapa asiaCapital4 = nový HashMap (); asiaCapital4.put ("Južná Kórea", "Soul"); asiaCapital4.put ("Japonsko", "Osaka"); asiaCapital4.put ("Čína", "Peking"); Výsledok mapy = areEqualKeyValues ​​(asiaCapital3, asiaCapital4); assertEquals (3, result.size ()); assertThat (result, hasEntry ("Japan", false)); assertThat (výsledok, hasEntry ("Južná Kórea", pravda)); assertThat (výsledok, hasEntry ("Čína", pravda)); }

5. Rozdiel na mape pomocou Guavy

Nakoniec uvidíme ako získať podrobný rozdiel medzi dvoma HashMaps pomocou Guavy Maps.difference ().

Táto metóda vracia a MapDifference objekt, ktorý má množstvo užitočných metód na analýzu rozdielu medzi Mapy. Pozrime sa na niektoré z nich.

5.1. MapDifference.entriesDiffering ()

Najprv získame spoločné kľúče, ktoré majú v každej inú hodnotu HashMap použitím MapDifference.entriesDiffering ():

@Test public void givenDifferentMaps_whenGetDiffUsingGuava_thenSuccess () {Map asia1 = new HashMap (); asia1.put ("Japonsko", "Tokio"); asia1.put ("Južná Kórea", "Soul"); asia1.put ("India", "New Delhi"); Mapa asia2 = new HashMap (); asia2.put ("Japonsko", "Tokio"); asia2.put ("Čína", "Peking"); asia2.put ("India", "Dillí"); MapDifference diff = Maps.difference (asia1, asia2); Mapa entriesDiffering = diff.entriesDiffering (); assertFalse (diff.areEqual ()); assertEquals (1, entriesDiffering.size ()); assertThat (entriesDiffering, hasKey ("India")); assertEquals ("Nové Dillí", entriesDiffering.get ("India"). leftValue ()); assertEquals ("Dillí", entriesDiffering.get ("India"). rightValue ()); }

The entriesDiffering () metóda vráti nový Mapa ktorá obsahuje sadu bežných kľúčov a ValueDifference objekty ako množina hodnôt.

Každý ValueDifference objekt má a leftValue () a rightValue () metódy, ktoré vracajú hodnoty z týchto dvoch Mapyresp.

5.2. MapDifference.entriesOnlyOnRight () a MapDifference.entriesOnlyOnLeft ()

Potom môžeme získať záznamy, ktoré existujú iba v jednom HashMap použitím MapDifference.entriesOnlyOnRight () a MapDifference.entriesOnlyOnLeft ():

@Test public void givenDifferentMaps_whenGetEntriesOnOneSideUsingGuava_thenSuccess () {MapDifference diff = Maps.difference (asia1, asia2); Map entriesOnlyOnRight = diff.entriesOnlyOnRight (); Map entriesOnlyOnLeft = diff.entriesOnlyOnLeft (); assertEquals (1, entriesOnlyOnRight.size ()); assertEquals (1, entriesOnlyOnLeft.size ()); assertThat (entriesOnlyOnRight, hasEntry ("Čína", "Peking")); assertThat (entriesOnlyOnLeft, hasEntry ("Južná Kórea", "Soul")); }

5.3. MapDifference.entriesInCommon ()

Ďalšie, dostaneme bežné záznamy pomocou MapDifference.entriesInCommon ():

@Test public void givenDifferentMaps_whenGetCommonEntriesUsingGuava_thenSuccess () {MapDifference diff = Maps.difference (asia1, asia2); Map entriesInCommon = diff.entriesInCommon (); assertEquals (1, entriesInCommon.size ()); assertThat (entriesInCommon, hasEntry ("Japonsko", "Tokio")); }

5.4. Prispôsobenie Maps.difference () Správanie

Odkedy Maps.difference () použitie rovná sa () a hashCode () predvolene na porovnanie položiek nebude fungovať pre objekty, ktoré ich neimplementujú správne:

@Test public void givenSimilarMapsWithArrayValue_whenCompareUsingGuava_thenFail () {MapDifference diff = Maps.difference (asiaCity1, asiaCity2); assertFalse (diff.areEqual ()); }

Ale, môžeme prispôsobiť metódu použitú pri porovnávaní pomocou Rovnocennosť.

Napríklad definujeme Rovnocennosť pre typ Reťazec [] porovnať Reťazec [] hodnoty v našom HashMaps ako sa nám páči:

@Test public void givenSimilarMapsWithArrayValue_whenCompareUsingGuavaEquivalence_thenSuccess () {Equivalence eq = new Equivalence () {@Override protected boolean doEquivalent (String [] a, String [] b) {return Arrays.equals (a, b); } @Override chránené int doHash (hodnota reťazca []) {návratová hodnota.hashCode (); }}; MapDifference diff = Maps.difference (asiaCity1, asiaCity2, eq); assertTrue (diff.areEqual ()); diff = Maps.difference (asiaCity1, asiaCity3, eq); assertFalse (diff.areEqual ()); }

6. Záver

V tomto článku sme diskutovali o rôznych spôsoboch porovnávania HashMaps v Jave. Dozvedeli sme sa viac spôsobov, ako skontrolovať, či sú dva HashMaps sú si rovné a ako získať podrobný rozdiel.

Celý zdrojový kód je k dispozícii na GitHub.


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