Két HashMaps összehasonlítása Java-ban

1. Áttekintés

Ebben az oktatóanyagban különböző módokat fogunk felfedezni kettő összehasonlítására HashMaps Java-ban.

Több módot is megvitatunk annak ellenőrzésére, hogy kettő van-e HashMaps hasonlóak. A Java 8 Stream API-t és a Guava-t is felhasználjuk a különböző különbségek részletes megértéséhez HashMaps.

2. Használata Map.equals ()

Először is használni fogjuk Map.equals () hogy kettőt ellenőrizzenek HashMaps ugyanazok a bejegyzések:

@Test public void whenCompareTwoHashMapsUsingEquals_thenSuccess () {Térkép asiaCapital1 = new HashMap (); asiaCapital1.put ("Japán", "Tokió"); asiaCapital1.put ("Dél-Korea", "Szöul"); Térkép asiaCapital2 = új HashMap (); asiaCapital2.put ("Dél-Korea", "Szöul"); asiaCapital2.put ("Japán", "Tokió"); Térkép asiaCapital3 = új HashMap (); asiaCapital3.put ("Japán", "Tokió"); asiaCapital3.put ("Kína", "Peking"); assertTrue (asiaCapital1.egyenlő (asiaCapital2)); assertFalse (asiaCapital1.egyenlő (asiaCapital3)); }

Itt hármat hozunk létre HashMap objektumok és bejegyzések hozzáadása. Akkor használjuk Map.equals () hogy kettőt ellenőrizzenek HashMaps ugyanazok a bejegyzések.

Így Map.equals () működik a kulcsok és értékek összehasonlításával a Object.equals () módszer. Ez azt jelenti, hogy csak akkor működik, ha a kulcs és az érték objektumok egyaránt megvalósulnak egyenlő () megfelelően.

Például, Map.equals () nem működik, ha az érték típusa tömb, tömbként egyenlő () metódus összehasonlítja az identitást, és nem a tömb tartalmát:

@Test public void whenCompareTwoHashMapsWithArrayValuesUsingEquals_thenFail () {Map asiaCity1 = new HashMap (); asiaCity1.put ("Japán", új húr [] {"Tokió", "Oszaka"}); asiaCity1.put ("Dél-Korea", új húr [] {"Szöul", "Busan"}); Térkép asiaCity2 = új HashMap (); asiaCity2.put ("Dél-Korea", új húr [] {"Szöul", "Busan"}); asiaCity2.put ("Japán", új húr [] {"Tokió", "Oszaka"}); assertFalse (asiaCity1.equals (asiaCity2)); }

3. A Java használata Folyam API

Saját összehasonlító módszerünket is megvalósíthatjuk HashMaps a Java 8 használatával Folyam API:

privát logikai értékek areEqual (Map first, Map second) {if (first.size ()! = second.size ()) {return false; } return first.entrySet (). stream () .allMatch (e -> e.getValue (). egyenlő (second.get (e.getKey ()))); }

Az egyszerűség kedvéért a egyenlőek() módszer, amelyet most összehasonlításra használhatunk HashMap tárgyak:

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

De testreszabhatjuk saját módszerünket is areEqualWithArrayValue () a tömbértékek kezelésével Tömbök.egyenlő () két tömb összehasonlításához:

privát logikai értékek areEqualWithArrayValue (Map first, Map second) {if (first.size ()! = second.size ()) {return false; } return first.entrySet (). stream () .allMatch (e -> Tömbök.egyenlő (e.getValue (), second.get (e.getKey ()))); }

nem úgy mint Map.equals (), a saját módszerünk sikeresen összehasonlítja HashMaps tömbértékekkel:

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

4. Összehasonlítás HashMap Kulcsok és értékek

Ezután nézzük meg, hogyan lehet kettőt összehasonlítani HashMap kulcsokat és a hozzájuk tartozó értékeket.

4.1. Összehasonlítás HashMap Kulcsok

Először ellenőrizhetjük, hogy kettő van-e HashMaps azonos kulcsokkal, csak összehasonlítva a kulcsokat KeySet ():

@Test public void whenCompareTwoHashMapKeys_thenSuccess () {assertTrue (asiaCapital1.keySet (). Egyenlő (asiaCapital2.keySet ())); assertFalse (asiaCapital1.keySet (). egyenlő (asiaCapital3.keySet ())); }

4.2. Összehasonlítás HashMap Értékek

Ezután meglátjuk, hogyan lehet összehasonlítani HashMap értékeket egyenként.

Megvalósítunk egy egyszerű módszert annak ellenőrzésére, hogy mely kulcsoknak ugyanaz az értéke mindkét esetben HashMaps felhasználásával Folyam API:

privát Térkép areEqualKeyValues ​​(Első térkép, Térkép második) {return first.entrySet (). stream () .collect (Collectors.toMap (e -> e.getKey (), e -> e.getValue (). egyenlő (második get (e.getKey ()))))); }

Most már használhatjuk areEqualKeyValues ​​() két különböző összehasonlítására HashMaps részletesen megtekintheti, hogy mely kulcsok azonos értékűek és melyek különböző értékekkel:

@Test public void whenCompareTwoHashMapKeyValuesUsingStreamAPI_thenSuccess () {Térkép asiaCapital3 = új HashMap (); asiaCapital3.put ("Japán", "Tokió"); asiaCapital3.put ("Dél-Korea", "Szöul"); asiaCapital3.put ("Kína", "Peking"); Térkép asiaCapital4 = új HashMap (); asiaCapital4.put ("Dél-Korea", "Szöul"); asiaCapital4.put ("Japán", "Oszaka"); asiaCapital4.put ("Kína", "Peking"); Térkép eredménye = areEqualKeyValues ​​(asiaCapital3, asiaCapital4); assertEquals (3, eredmény.méret ()); assertThat (eredmény, hasEntry ("Japán", hamis)); assertThat (eredmény, hasEntry ("Dél-Korea", igaz)); assertThat (eredmény, hasEntry ("Kína", igaz)); }

5. Térkép különbség a Guava használatával

Végül meglátjuk hogyan lehet részletes különbséget elérni kettő között HashMaps Guava használatával Térképek.különbség ().

Ez a módszer a MapDifference objektum, amely számos hasznos módszerrel elemzi a Térképek. Vessünk egy pillantást ezekre.

5.1. MapDifference.entriesDiffering ()

Először megkapjuk közös kulcsok, amelyek mindegyikében különböző értékekkel rendelkeznek HashMap felhasználásával MapDifference.entriesDiffering ():

@Test public void givenDifferentMaps_whenGetDiffUsingGuava_thenSuccess () {Térkép asia1 = new HashMap (); asia1.put ("Japán", "Tokió"); asia1.put ("Dél-Korea", "Szöul"); asia1.put ("India", "Újdelhi"); Térkép asia2 = új HashMap (); asia2.put ("Japán", "Tokió"); asia2.put ("Kína", "Peking"); asia2.put ("India", "Delhi"); MapDifference diff = Maps.difference (asia1, asia2); Térkép bejegyzésekDiffering = diff.entriesDiffering (); assertFalse (diff.areEqual ()); assertEquals (1, bejegyzésekDiffering.size ()); assertThat (entryDiffering, hasKey ("India")); assertEquals ("Újdelhi", recordsDiffering.get ("India"). leftValue ()); assertEquals ("Delhi", recordsDiffering.get ("India"). rightValue ()); }

A bejegyzések Különböző () metódus új értéket ad vissza Térkép amely tartalmazza a közös kulcsok halmazát és Értékkülönbség objektumok mint értékhalmaz.

Minden egyes Értékkülönbség objektumnak van egy leftValue () és rightValue () módszerek, amelyek visszaadják a kettő értékeit Térképekilletőleg.

5.2. MapDifference.entriesOnlyOnRight () és MapDifference.entriesOnlyOnLeft ()

Ezután csak egyben kaphatunk bejegyzéseket HashMap felhasználásával MapDifference.entriesOnlyOnRight () és MapDifference.entriesOnlyOnLeft ():

@Test public void givenDifferentMaps_whenGetEntriesOnOneSideUsingGuava_thenSuccess () {MapDifference diff = Maps.difference (asia1, asia2); Térkép bejegyzésekOnlyOnRight = diff.entriesOnlyOnRight (); TérképbejegyzésekOnlyOnLeft = diff.entriesOnlyOnLeft (); assertEquals (1, bejegyzésekOnlyOnRight.size ()); assertEquals (1, bejegyzésekOnLOnLeft.size ()); assertThat (bejegyzésekOnlyOnRight, hasEntry ("Kína", "Peking")); assertThat (entryOnlyOnLeft, hasEntry ("Dél-Korea", "Szöul")); }

5.3. MapDifference.entriesInCommon ()

Következő, használatával kapunk közös bejegyzéseket MapDifference.entriesInCommon ():

@Test public void givenDifferentMaps_whenGetCommonEntriesUsingGuava_thenSuccess () {MapDifference diff = Maps.difference (asia1, asia2); TérképbejegyzésekInCommon = diff.entriesInCommon (); assertEquals (1, bejegyzésekInCommon.size ()); assertThat (entryInCommon, hasEntry ("Japán", "Tokió")); }

5.4. Testreszabás Maps.difference () Viselkedés

Mivel Maps.difference () használat egyenlő () és hash kód() alapértelmezés szerint a bejegyzések összehasonlítása nem működik azoknál az objektumoknál, amelyek nem megfelelően hajtják végre őket:

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

De, személyre szabhatjuk az összehasonlításhoz használt módszert Egyenértékűség.

Például meghatározzuk Egyenértékűség típushoz Húr[] összehasonlítani Húr[] értékek a mi HashMaps ahogy nekünk tetszik:

@Test public void givenSimilarMapsWithArrayValue_whenCompareUsingGuavaEquivalence_thenSuccess () {Equivalence eq = new Equivalence () {@Override protected boolean doEquivalent (String [] a, String [] b) {return Arrays.equals (a, b); } @Orride 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. Következtetés

Ebben a cikkben az összehasonlítás különféle módjait vitattuk meg HashMaps Java-ban. Többféle módszert tanultunk meg annak ellenőrzésére, hogy kettő van-e HashMaps egyenlőek, és hogyan lehet elérni a részletes különbséget is.

A teljes forráskód elérhető a GitHubon.


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