Java最高

使用Spring 5和Spring Boot 2开始,通过学习的春天课程:

>>看看这个课程

1.概述

在本教程中,我们将探索不同的方式来比较两个哈希现象在Java.

我们将讨论多种方法来检查是否有两个哈希现象是相似的。我们还将使用Java 8 Stream API和Guava来获得不同之间的详细差异哈希现象

2.使用Map.equals ()

首先,我们将使用Map.equals ()检查是否有两个哈希现象拥有相同的条目:

@Test public void whenCompareTwoHashMapsUsingEquals_thenSuccess() {Map asiaCapital1 = new HashMap();asiaCapital1。把(“日本”、“东京”);asiaCapital1。put(“韩国”,“首尔”);Map asiaCapital2 = new HashMap();asiaCapital2。put(“韩国”,“首尔”);asiaCapital2。把(“日本”、“东京”); Map asiaCapital3 = new HashMap(); asiaCapital3.put("Japan", "Tokyo"); asiaCapital3.put("China", "Beijing"); assertTrue(asiaCapital1.equals(asiaCapital2)); assertFalse(asiaCapital1.equals(asiaCapital3)); }

这里,我们创建了3个HashMap对象和添加条目。然后我们使用Map.equals ()检查是否有两个哈希现象有相同的条目。

的方式Map.equals ()作品是使用键和值使用的Object.equals ()方法这意味着它仅在键和值对象实现时工作equals ()适当地。

例如,Map.equals ()当值类型为数组时,不起作用,作为数组equals ()方法比较标识而不是数组的内容:

@test公共void whencomparetwohashmapswitharrayvaluesusingequals_thenfail(){map  asiacity1 = new hashmap ();asiacity1.put(“日本”,新String [] {“tokyo”,“大阪”});asiacity1.put(“韩国”,新String [] {“首尔”,“釜山”});映射 asiacity2 = new hashmap ();asiacity2.put(“韩国”,新字符串[] {“首尔”,“釜山”});asiacity2.put(“日本”,新String [] {“tokyo”,“大阪”});assertfalse(Asiacity1.equals(Asiacity2));}

3.使用JavaAPI

我们还可以实现自己的比较方法哈希现象使用Java 8API:

private boolean areEqual(Map,第二个是>){if (first.size() != second.size()){返回false;} return first.entrySet().stream() .allMatch(e -> e.getValue().equals(second.get(e.getKey())));}

为简单起见,我们实施了areEqual ()方法,我们现在可以用来比较hashmap 对象:

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

但我们也可以定制自己的方法areEqualWithArrayValue ()使用。来处理数组值Arrays.equals ()比较两个数组:

私有布尔areequalwitharrayvalue(map  first,map  {if(first.size()!= second.size()){返回false;}返回first.entryset()。stream().allmatch(e  - > arrays.equals(e.getvalue(),second.get(e.getkey())))));}

不像Map.equals (),我们自己的方法将成功比较哈希现象数组的值:

@test公共void whencomparetwohashmapswitharrayvaluesusingstreamapi_thensccess(){asserttrue(areequalwitharrayvalue(Aseacity1,Asiacity2));Assertfalse(AreequalWitharrayValue(Asiacity1,Asiacity3));}

4.比较HashMap键和价值观

接下来,让我们看看如何比较两个HashMap键及其对应的值。

4.1。比较HashMap钥匙

首先,我们可以检查是否有两个哈希现象通过比较它们有相同的键键盘()

@test公共void whencomparetwohashmapkeys_thensccess_thensccess(){asserttrue(asiacapital1.keyset()。等于(asiacapital2.keyset()));assertfalse(asiacapital1.keyset()。等于(asiacapital3.keyset()));}

4.2。比较HashMap

接下来,我们将看到如何比较HashMap值一个接一个。

我们将实现一个简单的方法来检查哪个键在两个键中具有相同的值哈希现象使用API:

私有地图 areequalkeyvalues(map  first,map  second){return first.entryset()。stream().collect(collectors.tomap(e-> e.getkey(e-> e.getkey)),e  - > e.getValue()。等于(第二种)))));}

我们现在可以使用areEqualKeyValues ()比较两种不同的哈希现象要详细了解哪个密钥具有相同的值,并且具有不同的值:

@test公共void whencomparetwohashmapkeyvaluesusingstreamapi_thensccess(){map  asiacapital3 = new hashmap ();asiacapital3.put(“日本”,“东京”);asiacapital3.put(“韩国”,“首尔”);asiacapital3.put(“中国”,“北京”);地图 asiacapital4 = new hashmap ();asiacapital4.put(“韩国”,“首尔”);asiacapital4.put(“日本”,“大阪”);asiacapital4.put(“中国”,“北京”);地图结果= areequalkeyvalues(asiacapital3,asiacapital4);assertequals(3,结果.Size()); assertThat(result, hasEntry("Japan", false)); assertThat(result, hasEntry("South Korea", true)); assertThat(result, hasEntry("China", true)); }

5.使用番石榴地图差异

最后,我们会看到如何得到两者之间的详细区别哈希现象使用番石榴Maps.difference()。

此方法返回一个MapDifference.具有许多有用方法来分析差异的对象地图。让我们来看看其中的一些。

5.1。mapdifference.entriesdiffering()

首先,我们将获得每个具有不同价值的常见键HashMap使用mapdifference.entriesdiffering()

@test public vivendifferentmaps_whengetdiffusingguava_thensccess(){map  asia1 = new hashmap ();asia1.put(“日本”,“东京”);asia1.put(“韩国”,“首尔”);asia1.put(“印度”,“新德里”);地图 asia2 = new hashmap ();asia2.put(“日本”,“东京”);asia2.put(“中国”,“北京”);asia2.put(“印度”,“德里”);MapDifference  Diff = Maps.difference(Asia1,Asia2);映射> entriessdiffering = diff.entriesdiffering(); assertFalse(diff.areEqual()); assertEquals(1, entriesDiffering.size()); assertThat(entriesDiffering, hasKey("India")); assertEquals("New Delhi", entriesDiffering.get("India").leftValue()); assertEquals("Delhi", entriesDiffering.get("India").rightValue()); }

entriesDiffering ()方法返回一个新的地图其中包含一组常见键和ValueDifference对象作为值集。

每个ValueDifference对象有leftValue ()rightValue ()方法返回两者中的值地图分别。

5.2。MapDifference.entriesOnlyOnRight ()mapdifference.entriesonlyonleft()

然后,我们可以获得仅在一个中存在的条目HashMap使用MapDifference.entriesOnlyOnRight ()MapDifference.entriesOnlyOnLeft ():

@Test public void givenDifferentMaps_whenGetEntriesOnOneSideUsingGuava_thenSuccess() {MapDifference diff = Maps。差异(asia1 asia2);Map entriesOnlyOnRight = diff.com entriesOnlyOnRight();Map entriesOnlyOnLeft = diff.com entriesOnlyOnLeft();assertequal (entriesOnlyOnRight.size ());assertequal (entriesOnlyOnLeft.size ());为了(entriesOnlyOnRight hasEntry(“中国”、“北京”));assertThat(entriesOnlyOnLeft, hasEntry(“韩国”,“首尔”));}

5.3。MapDifference.entriesInCommon ()

接下来,我们将使用公共条目mapdifference.entriesincommon():

@Test public void givendiffentmaps_whengetcommonentriesusingguava_thensuccess () {MapDifference diff = Maps. getcommonentriesusingguava_thensuccess ();差异(asia1 asia2);Map entriesInCommon = diff.entriesInCommon();assertequal (entriesInCommon.size ());为了(entriesInCommon hasEntry(“日本”、“东京”));}

5.4。定制Maps.difference ()行为

Maps.difference ()使用equals ()hashcode()默认情况下比较条目,它不会对不能正确实现它们的对象工作:

@Test public void givenSimilarMapsWithArrayValue_whenCompareUsingGuava_thenFail() {MapDifference diff = Maps。差异(asiaCity1 asiaCity2);assertFalse (diff.areEqual ());}

但是,我们可以自定义方法在比较中使用等价

例如,我们将定义等价对于类型String []比较String []在我们的价值观哈希现象我们喜欢:

@Test public void givensimilarmapswitharrayvalue_whencompareusingguavaequivalence e_thensuccess () {Equivalence eq = new Equivalence() {@Override protected boolean doEquivalent(String[] a, String[] b) {return Arrays. getstring () {return Arrays. getstring ();= (a, b);} @Override protected int doHash(String[] value) {return value. hashcode ();}};MapDifference diff = Maps。差异(asiaCity1 asiaCity2, eq);assertTrue (diff.areEqual ());diff =地图。差异(asiaCity1 asiaCity3, eq);assertFalse (diff.areEqual ());}

6.结论

在本文中,我们讨论了比较的不同方式哈希现象在Java。我们学习了多种方法来检查两个哈希现象等于以及如何获得详细差异。

完整的源代码是可用的在GitHub

Java底部

使用Spring 5和Spring Boot 2开始,通过学习的春天课程:

>>看看这个课程
对这篇文章的评论关闭!