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.