Usporedba dviju hash karata u Javi

1. Pregled

U ovom vodiču, istražit ćemo različite načine za usporedbu dva HashMaps na Javi.

Razgovarat ćemo o više načina da provjerimo jesu li dva HashMaps su slični. Također ćemo koristiti Java 8 Stream API i Guavu kako bismo dobili detaljne razlike između različitih HashMaps.

2. Korištenje Map.equals ()

Prvo ćemo upotrijebiti Map.equals () provjeriti jesu li dvije HashMaps imaju iste unose:

@Test public void whenCompareTwoHashMapsUsingEquals_thenSuccess () {Map asiaCapital1 = new HashMap (); asiaCapital1.put ("Japan", "Tokio"); asiaCapital1.put ("Južna Koreja", "Seoul"); Mapa asiaCapital2 = novi HashMap (); asiaCapital2.put ("Južna Koreja", "Seul"); asiaCapital2.put ("Japan", "Tokio"); Mapa asiaCapital3 = novi HashMap (); asiaCapital3.put ("Japan", "Tokio"); asiaCapital3.put ("Kina", "Peking"); assertTrue (asiaCapital1.equals (asiaCapital2)); assertFalse (asiaCapital1.equals (asiaCapital3)); }

Evo, kreiramo tri HashMap objekata i dodavanje unosa. Onda koristimo Map.equals () provjeriti jesu li dvije HashMaps imaju iste unose.

Način na koji Map.equals () radi usporedbom ključeva i vrijednosti pomoću Object.equals () metoda. To znači da radi samo kada se implementiraju i objekti ključa i vrijednosti jednako () pravilno.

Na primjer, Map.equals () ne radi kada je vrsta vrijednosti niz, kao niz jednako () metoda uspoređuje identitet, a ne sadržaj niza:

@Test public void whenCompareTwoHashMapsWithArrayValuesUsingEquals_thenFail () {Map asiaCity1 = new HashMap (); asiaCity1.put ("Japan", novi niz [] {"Tokio", "Osaka"}); asiaCity1.put ("Južna Koreja", novi niz [] {"Seoul", "Busan"}); Mapa asiaCity2 = nova HashMap (); asiaCity2.put ("Južna Koreja", novi niz [] {"Seoul", "Busan"}); asiaCity2.put ("Japan", novi niz [] {"Tokio", "Osaka"}); assertFalse (asiaCity1.equals (asiaCity2)); }

3. Korištenje Jave Stream API

Također možemo primijeniti vlastitu metodu za usporedbu HashMaps koristeći Javu 8 Stream API:

private boolean areEqual (Map first, Map second) {if (first.size ()! = second.size ()) {return false; } return first.entrySet (). stream () .allMatch (e -> e.getValue (). jednako (second.get (e.getKey ()))); }

Radi jednostavnosti implementirali smo su jednaki() metodu koju sada možemo koristiti za usporedbu HashMap objekti:

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

Ali možemo prilagoditi i vlastitu metodu areEqualWithArrayValue () za rukovanje vrijednostima polja pomoću Nizovi.equals () za usporedbu dva polja:

private boolean areEqualWithArrayValue (karta prva, karta druga) {if (first.size ()! = second.size ()) {return false; } return first.entrySet (). stream () .allMatch (e -> Arrays.equals (e.getValue (), second.get (e.getKey ()))); }

Za razliku od Map.equals (), naša vlastita metoda uspješno će se usporediti HashMaps s vrijednostima polja:

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

4. Uspoređivanje HashMap Ključevi i vrijednosti

Dalje, pogledajmo kako usporediti dva HashMap tipke i njihove odgovarajuće vrijednosti.

4.1. Uspoređujući HashMap Ključevi

Prvo, možemo provjeriti jesu li dvije HashMaps imaju iste ključeve samo usporedbom njihovih Skup ključeva ():

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

4.2. Uspoređujući HashMap Vrijednosti

Dalje ćemo vidjeti kako usporediti HashMap vrijednosti jednu po jednu.

Implementirat ćemo jednostavnu metodu za provjeru koji ključevi imaju jednaku vrijednost u oba HashMaps koristeći Stream API:

privatna karta areEqualKeyValues ​​(karta prva, karta druga) {return first.entrySet (). stream () .collect (Collectors.toMap (e -> e.getKey (), e -> e.getValue (). jednako (drugo. get (e.getKey ())))); }

Sada možemo koristiti areEqualKeyValues ​​() usporediti dva različita HashMaps kako bismo detaljno vidjeli koji ključevi imaju istu vrijednost, a koji različite vrijednosti:

@Test public void whenCompareTwoHashMapKeyValuesUsingStreamAPI_thenSuccess () {Map asiaCapital3 = new HashMap (); asiaCapital3.put ("Japan", "Tokio"); asiaCapital3.put ("Južna Koreja", "Seul"); asiaCapital3.put ("Kina", "Peking"); Mapa asiaCapital4 = novi HashMap (); asiaCapital4.put ("Južna Koreja", "Seoul"); asiaCapital4.put ("Japan", "Osaka"); asiaCapital4.put ("Kina", "Peking"); Rezultat karte = areEqualKeyValues ​​(asiaCapital3, asiaCapital4); assertEquals (3, result.size ()); assertThat (rezultat, hasEntry ("Japan", netačno)); assertThat (rezultat, hasEntry ("Južna Koreja", istina)); assertThat (rezultat, hasEntry ("Kina", istina)); }

5. Razlika na mapi pomoću Guave

Napokon ćemo vidjeti kako dobiti detaljnu razliku između dva HashMaps koristeći Guavu Karte.razlika ().

Ova metoda vraća a MapDifference objekt koji ima brojne korisne metode za analizu razlike između Karte. Pogledajmo neke od njih.

5.1. MapDifference.entriesDiffering ()

Prvo ćemo dobiti uobičajeni ključevi koji imaju različite vrijednosti u svakom HashMap koristeći MapDifference.entriesDiffering ():

@Test javna praznina givenDifferentMaps_whenGetDiffUsingGuava_thenSuccess () {Map asia1 = new HashMap (); asia1.put ("Japan", "Tokio"); asia1.put ("Južna Koreja", "Seoul"); asia1.put ("Indija", "New Delhi"); Mapa asia2 = nova HashMap (); asia2.put ("Japan", "Tokio"); asia2.put ("Kina", "Peking"); asia2.put ("Indija", "Delhi"); MapDifference diff = Maps.difference (asia1, asia2); Karta entriesDiffering = diff.entriesDiffering (); assertFalse (diff.areEqual ()); assertEquals (1, entriesDiffering.size ()); assertThat (entriesDiffering, hasKey ("India")); assertEquals ("New Delhi", entriesDiffering.get ("India"). leftValue ()); assertEquals ("Delhi", entriesDiffering.get ("Indija"). rightValue ()); }

The entriesDiffering () metoda vraća novu Karta koji sadrži skup uobičajenih ključeva i ValueDifference objekti kao skup vrijednosti.

Svaki ValueDifference objekt ima a leftValue () i rightValue () metode koje vraćaju vrijednosti u dvoje Karteodnosno.

5.2. MapDifference.entriesOnlyOnRight () i MapDifference.entriesOnlyOnLeft ()

Tada možemo dobiti unose koji postoje samo u jednom HashMap koristeći MapDifference.entriesOnlyOnRight () i MapDifference.entriesOnlyOnLeft ():

@Test javna praznina givenDifferentMaps_whenGetEntriesOnOneSideUsingGuava_thenSuccess () {MapDifference diff = Maps.difference (asia1, asia2); Mapa entriesOnlyOnRight = diff.entriesOnlyOnRight (); Mapa entriesOnlyOnLeft = diff.entriesOnlyOnLeft (); assertEquals (1, entriesOnlyOnRight.size ()); assertEquals (1, entriesOnlyOnLeft.size ()); assertThat (entriesOnlyOnRight, hasEntry ("Kina", "Peking")); assertThat (entriesOnlyOnLeft, hasEntry ("Južna Koreja", "Seoul")); }

5.3. MapDifference.entriesInCommon ()

Sljedeći, dobit ćemo uobičajene unose pomoću MapDifference.entriesInCommon ():

@Test javna praznina givenDifferentMaps_whenGetCommonEntriesUsingGuava_thenSuccess () {MapDifference diff = Maps.difference (asia1, asia2); Unosi na mapiInCommon = diff.entriesInCommon (); assertEquals (1, entriesInCommon.size ()); assertThat (entriesInCommon, hasEntry ("Japan", "Tokyo")); }

5.4. Prilagođavanje Maps.difference () Ponašanje

Od Maps.difference () koristiti jednako () i hashCode () prema zadanim postavkama za usporedbu unosa neće raditi za Objekte koji ih ne implementiraju pravilno:

@Test javna praznina givenS similarMapsWithArrayValue_whenCompareUsingGuava_thenFail () {MapDifference diff = Maps.difference (asiaCity1, asiaCity2); assertFalse (diff.areEqual ()); }

Ali, možemo prilagoditi metodu koja se koristi u usporedbi pomoću Ekvivalentnost.

Na primjer, definirat ćemo Ekvivalentnost za tip Niz[] usporediti Niz[] vrijednosti u našem HashMaps kako volimo:

@Test javna praznina givenS similarMapsWithArrayValue_whenCompareUsingGuavaEquivalence_thenSuccess () {Ekvivalencija eq = nova ekvivalencija () {@Override zaštićena logička doEquivalent (String [] a, String [] b) {return Arrays.equals (a, b); } @Override protected int doHash (String [] value) {return value.hashCode (); }}; MapDifference diff = Maps.difference (asiaCity1, asiaCity2, eq); assertTrue (diff.areEqual ()); diff = Maps.difference (asiaCity1, asiaCity3, eq); assertFalse (diff.areEqual ()); }

6. Zaključak

U ovom smo članku razgovarali o različitim načinima usporedbe HashMaps na Javi. Naučili smo više načina kako provjeriti jesu li dva HashMaps su jednaki i kako dobiti i detaljnu razliku.

Cjeloviti izvorni kod dostupan je na GitHubu.


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