当前位置: 首页 > 科技观察

如何比较2个数组是否相等以及如何检测不匹配

时间:2023-03-15 15:46:59 科技观察

当我有空的时候,我会密切关注读者的一举一动,不让他们的任何问题帮助他们成长,虽然这不是我应该做的我最好,但我真的很喜欢和他们交流的感觉。毕竟,我可以帮助一个人。也许我的一个小小的举动,就能让他们的成长过程迈出一大步——请给我一个骄傲的机会。有一次,我在“石器时代”组发现了一个有趣的问题:“Howtocomparetwoarraysforequalityandhowtodetectmismatches?”严格来说,这是两个问题,一是比较数组是否相等,二是如果数组不相等,是哪些元素导致的。01.比较数组是否相等,可以使用Arrays.equals()方法比较两个数组是否相等。数组可以是基本数据类型、引用数据类型和泛型类型。我们先以字符串为例。String[]str1={"沉","莫","王","二"};String[]str2={"沉","莫","王","二"};String[]str3={"沉","莫","王","三"};现在,让我们比较一下:str1是否等于str2,str1是否等于str3。(虽然不用代码对比也能猜出答案,请假装配合)String[]str1={"Shen","Mo","Wang","Two"};String[]str2={"Shen"","墨","王","二"};String[]str3={"申","墨","王","三"};System.out.println(Arrays.equals(str1,str2));System.out.println(Arrays.equals(str1,str3));程序输出如下:truefalse很好,正好符合我们的预期。另外,我们还可以判断指定的是否两个数组中的范围相等通过以下方法:booleanequals(Object[]a,intaFromIndex,intaToIndex,Object[]b,intbFromIndex,intbToIndex)比较str1和str3中的前三个元素是否相等:System.out.println(Arrays.equals(str1,0,3,str3,0,3));程序的输出如下:true现在,让我们定义一个类Writer,它有两个字段:int类型的年龄,和String类型的名称,并重写equals()和hashCode()方法。publicclassWriter{privateintage;privateStringname;@Overridepublicbooleanequals(Objecto){if(this==o)returntrue;if(o==null||getClass()!=o.getClass())returnfalse;Writerwriter=(Writer)o;returnage==writer.age&&Objects.equals(name,writer.name);}@OverridepublicinthashCode(){returnObjects.hash(age,name);}publicWriter(intage,Stringname){this.age=age;this.name=name;}//getter/setter}创建3种Writer类型的数组:Writer[]writer1={newWriter(18,"SilenceKing2"),newWriter(16,"SilenceKing3")};Writer[]writer2={newWriter(18,"沉默之王2"),newWriter(16,"沉默之王3")};Writer[]writer3={newWriter(18,"沉默之王1"),newWriter(16,"沉默之王3"))};比较一下:writer1是否等于writer2,writer1是否等于writer3。System.out.println(Arrays.equals(writer1,writer2));System.out.println(Arrays.equals(writer1,writer3));程序的输出看起来像这样:truefalse答案完全符合预期,因为我们重写了equals()方法——如果年龄和名字相等,则表示两个Writer对象相等。如果我们不重写这个方法,此时我们可以使用Comparator比较器。ComparatorbyAge=Comparator.comparing(Writer::getAge);ComparatorbyName=Comparator.comparing(Writer::getName);byAge是和Writer的年龄比较,byName是和Writer的名字比较。然后我们将writer1和writer3与比较器byAge和byName进行比较。System.out.println(Arrays.equals(writer1,writer3,byAge));System.out.println(Arrays.equals(writer1,writer3,byName));程序输出结果如下:truefalse答案与预期完全一致,writer1数组中的年龄(18和16)与writer3数组中的年龄(18和16)完全相同;writer1数组中的名字(silentking2和silentkingthree)和writer3数组中的名字(silentkingone和silentkingWangIII)不完全一样。02.检测不匹配,可以使用Arrays.mismatch()方法检测两个数组中哪些元素不相等。如果2个数组完全相等,则该方法返回-1;否则,返回第一个不匹配项的索引。首先让我们看看str1和str2是否有不相等的元素。System.out.println(Arrays.mismatch(str1,str2));程序的输出如下:-1和我们预期的结果是一致的,因为str1和str2没有不匹配。让我们再看看str1和str3。System.out.println(Arrays.mismatch(str1,str3));程序输出如下:3从下标3的元素中不匹配,因为str1中下标3的元素是“二”,str3中下标3的元素是“三”。Arrays.mismatch()方法也适用于自定义类型Writer。System.out.println(Arrays.mismatch(writer1,writer2));System.out.println(Arrays.mismatch(writer1,writer3));程序输出如下:-10与我们预期的结果一致,因为writer1和writer2没有不匹配,writer1和writer3不相等的元素都是从1开始,下标为0比较器也可以用来检测不等元素:System.out.println(Arrays.mismatch(writer1,writer3,byAge));System.out.println(Arrays.mismatch(writer1,writer3,byName));程序输出结果为如下:-10原因我就不解释了,因为我觉得你已经完全掌握了Arrays.equals()方法和Arrays.mismatch()方法。我希望你可以自己尝试一下。我已经把源码上传到码云了。地址如下:https://gitee.com/qing_gee/JavaPoint/tree/master03。谢谢亲爱的读者,以上就是本文的全部内容,你学到新知识了吗?我觉得答案是肯定的,给自己竖起大拇指。