如何比較2個數組相等以及如何檢出不匹配項

當我空閒的時候,我會密切地觀察讀者群裡的一舉一動,不放過他們的任何一個問題,幫助他們成長雖然不是我應盡的義務,但我的確喜歡和他們交流的感覺,畢竟能幫一個是一個。也許我的一個小小的舉動,就能夠他們跨越成長過程中的一大步——請給我一次驕傲的機會嘛。

有一次,我在“石器時代”群裡發現了 1 個有意思的提問:“如何比較 2 個數組相等以及如何檢出不匹配項?”嚴格意義上講,這是 2 個問題,其一是比較數組是否相等,其二是如果數組不相等,是哪幾個元素導致的。

01、比較數組是否相等

可以通過 Arrays.equals() 方法來比較 2 個數組是否相等,數組可以是基本數據類型,也可以是引用數據類型,以及泛型。我們就先拿字符串來作為示例吧。

<code>String [] str1 = {"漩","渦", "學","院"};
String [] str2 = {"漩","渦", "學","院"};
String [] str3 = {"漩","渦", "學","院"};/<code>

現在,就讓我們來比較一下:str1 是否與 str2 相等,str1 是否與 str3 相等。(儘管不用代碼比較你都能猜出答案,但還是請假裝配合一下)

<code>String[] str1 = {"漩","渦", "學","院"};
String[] str2 = {"漩","渦", "學","院"};
String[] str3 = {"漩","渦", "學","院"};

System.out.println(Arrays.equals(str1, str2));
System.out.println(Arrays.equals(str1, str3));/<code>

程序輸出的結果如下所示:

<code>true
false/<code>

不錯不錯,和我們的預期完全相符。另外,我們還可以通過以下方法來判斷 2 個數組中指定的範圍是否相等:

<code>boolean equals(Object[] a, int aFromIndex, int aToIndex,
                         Object[] b, int bFromIndex, int bToIndex)/<code>

來比較一下 str1 和 str3 中前 3 個元素是否相等:

<code>System.out.println(Arrays.equals(str1, 0, 3, str3, 0, 3));/<code>

程序輸出的結果如下所示:

<code>true/<code>

現在,讓我們來自定義一個類 Writer,它有兩個字段:int 類型的 age,和 String 類型的 name,並重寫了 equals() 和 hashCode() 方法。

<code>public class Writer {
    private int age;
    private String name;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Writer writer = (Writer) o;
        return age == writer.age &&
                Objects.equals(name, writer.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }

    public Writer(int age, String name) {
        this.age = age;
        this.name = name;
    }

    // getter/setter
}/<code>

來創建 3 個 Writer 類型的數組:

<code>Writer [] writer1 = {new Writer(18,"沉默王二"),new Writer(16,"沉默王三")};
Writer [] writer2 = {new Writer(18,"沉默王二"),new Writer(16,"沉默王三")};
Writer [] writer3 = {new Writer(18,"沉默王一"),new Writer(16,"沉默王三")};/<code>

我們來比較一下:writer1 是否與 writer2 相等,writer1 是否與 writer3 相等。

<code>System.out.println(Arrays.equals(writer1,writer2));
System.out.println(Arrays.equals(writer1,writer3));/<code>

程序輸出的結果如下所示:

<code>true
false/<code>

答案完全符合預期,因為我們重寫了 equals() 方法——如果 age 相等,name 相等,那就表明 2 個 Writer 對象相等。假如我們沒有重寫該方法,此時就可以藉助 Comparator 比較器。

<code>Comparator<writer> byAge = Comparator.comparing(Writer::getAge);
Comparator<writer> byName = Comparator.comparing(Writer::getName);/<writer>/<writer>/<code>

byAge 是通過 Writer 的 age 比較的,byName 是通過 Writer 的 name 比較的。然後我們來通過比較器 byAge 和 byName 比較一下 writer1 和 writer3。

<code>System.out.println(Arrays.equals(writer1, writer3, byAge));
System.out.println(Arrays.equals(writer1, writer3, byName));/<code>

程序輸出的結果如下所示:

<code>true
false/<code>

答案完全符合預期,writer1 數組中的 age(18 和 16)和 writer3 數組中的 age(18 和 16)完全相同;writer1 數組中的 name(沉默王二和沉默王三)和 writer3 數組中的 name(沉默王一和沉默王三)不完全相同。

02、檢出不匹配項

可以通過 Arrays.mismatch() 方法檢出 2 個數組中哪幾個元素不相等。如果 2 個數組完全相等,該方法返回 -1;否則的話,返回第一個不匹配項目的下標。

先來看看 str1 和 str2 是否有不相等的元素吧。

<code>System.out.println(Arrays.mismatch(str1, str2));/<code>

程序輸出的結果如下所示:

<code>-1/<code>

和我們預期的結果一致,因為 str1 和 str2 沒有不匹配項。那再來看看 str1 和 str3 吧。

<code>System.out.println(Arrays.mismatch(str1, str3));/<code>

程序輸出的結果如下所示:

<code>3/<code>

的確是從下標為 3 的元素開始不匹配的,因為 str1 中下標為 3 的元素為“二”,str3 中下標為 3 的元素為“三”。

Arrays.mismatch() 方法同樣適用於自定義類型 Writer。

<code>System.out.println(Arrays.mismatch(writer1,writer2));
System.out.println(Arrays.mismatch(writer1,writer3));/<code>

程序輸出的結果如下所示:

<code>-1
0/<code>

和我們預期的結果一致,因為 writer1 和 writer2 沒有不匹配項,writer1 和 writer3 不相等的元素是從第 1 開始的,下標為 0。

也可以通過 Comparator 來檢出不相等的元素:

<code>System.out.println(Arrays.mismatch(writer1, writer3, byAge));
System.out.println(Arrays.mismatch(writer1, writer3, byName));/<code>

程序輸出的結果如下所示:

<code>-1
0/<code>

原因我就不再解釋了,因為我認為你已經完全掌握了 Arrays.equals() 方法和 Arrays.mismatch() 方法。希望你能親自動手試一試哦,源碼我已經上傳到了碼雲,地址如下:

https://gitee.com/qing_gee/JavaPoint/tree/master

03、鳴謝

好了,親愛的讀者朋友,以上就是本文的全部內容了,是不是又學到了新知識?我想答案是肯定的,給自己點個贊吧。