web-dev-qa-db-ja.com

javaの2つの整数配列の比較

2つの配列を比較するコードを作成しようとしています。最初の配列には自分の数字を入れましたが、2番目の配列は入力ファイルから数値を取得します。この配列のサイズは、ファイルの最初の数値によって決まりますが、最初の配列のサイズは常に10です。長さは、両方の配列と数値で同じでなければなりません。私のコードは次のとおりです。

public static void compareArrays(int[] array1, int[] array2) {
    boolean b = false;
    for (int i = 0; i < array2.length; i++) {

        for (int a = 0; a < array1.length; a++) {

            if (array2[i] == array1[a]) {
                b = true;
                System.out.println("true");
            } else {
                b = false;
                System.out.println("False");
                break;
            }
        }
    }       
}
22
user2052514
public static void compareArrays(int[] array1, int[] array2) {
        boolean b = true;
        if (array1 != null && array2 != null){
          if (array1.length != array2.length)
              b = false;
          else
              for (int i = 0; i < array2.length; i++) {
                  if (array2[i] != array1[i]) {
                      b = false;    
                  }                 
            }
        }else{
          b = false;
        }
        System.out.println(b);
    }
19
slawter

私が見るものから、それらが等しいかどうかを確認しようとしますが、これが本当なら、次のようなものを選んでください:

boolean areEqual = Arrays.equals(arr1, arr2);

これが標準的な方法です。

Ops、それはJava docから、配列が等しいとみなされるためにソートされなければならないことを継ぎ合わせます:

「2つの配列に同じ数の要素が含まれ、2つの配列の対応する要素のペアがすべて等しい場合、2つの配列は等しいと見なされます。

見逃してすみません。

65
comanitza

つかいます
Arrays.equals(ary1,ary2); //ブール値を返します

[〜#〜] edit [〜#〜]
Arrays.deepEquals(ary1,ary2)を使用して2D配列も比較できます

Arrays.equls(ar1,ar2)Arrays.deepEquals(ar1,ar2)の比較については このリンク も確認してください

Java Arrays.equals()は2次元配列に対してfalseを返します

EDIT 2
これらのライブラリメソッドを使用したくない場合は、次のようにメソッドを簡単に実装できます。

public static boolean ArrayCompare(int[] a, int[] a2) {
    if (a==a2)   // checks for same array reference
        return true;
    if (a==null || a2==null)  // checks for null arrays
        return false;

    int length = a.length;
    if (a2.length != length)  // arrays should be of equal length
        return false;

    for (int i=0; i<length; i++)  // compare array values
        if (a[i] != a2[i])
            return false;

    return true;
}
34
exexzian

配列のサイズが同じであることがわかっている場合は、並べ替えて比較する方が高速であることが証明されています

Arrays.sort(array1)
Arrays.sort(array2)
return Arrays.equals(array1, array2)

配列内のデータの順序を変更したくない場合は、System.arraycopy 最初。

7

既存の回答はいずれもコンパレータの使用を伴わないため、バイナリツリーやソートには使用できません。だから私はこれをここに残すつもりです:

public static int compareIntArrays(int[] a, int[] b) {
    if (a == null) {
        return b == null ? 0 : -1;
    }
    if (b == null) {
        return 1;
    }
    int cmp = a.length - b.length;
    if (cmp != 0) {
        return cmp;
    }
    for (int i = 0; i < a.length; i++) {
        cmp = Integer.compare(a[i], b[i]);
        if (cmp != 0) {
            return cmp;
        }
    }
    return 0;
}
2
etherous

_.equals_のような簡単なものがありますが、コードで犯した2つの間違いを指摘したいと思います。 1つ目:配列を調べると、btrueまたはfalseであると言います。次に、forループのため、再度チェックを開始します。ただし、bに値を指定するたびに。したがって、何が起こっても、bに設定される値は常にLAST forループの値です。次回、_boolean b = true_、_if equal = true_を設定し、何もしない、_if equal = false_、_b=false_。

次に、_array1_の各値を_array2_の各値とチェックしています。正しく理解できれば、配列内の同じ場所で値を確認するだけで済みます。つまり、2番目のforループを削除し、if (array2[i] == array1[i])のように確認する必要があります。その後、コードも機能するはずです。

コードは次のように機能します。

_public static void compareArrays(int[] array1, int[] array2) {
    boolean b = true;
    for (int i = 0; i < array2.length; i++) {
        if (array2[i] == array1[i]) {
            System.out.println("true");
        } else {
            b = false;
            System.out.println("False");
        }
    } 
    return b;
_

}

しかし、他の人が言ったように、より簡単になります:Arrays.equals(ary1、ary2);

1
Joetjah

配列の長さは同じで、番号は全体で同じでなければなりません(配列の最初の番号はsasmeなどでなければなりません)

このコメントに基づいて、あなたはすでにあなたのアルゴリズムを持っています:

  1. 両方の配列の長さが同じかどうかを確認します。

    array1.length == array2.length

  2. 番号は同じ位置で同じでなければなりません:

    array1 [x] == array2 [x]

これを知って、次のようなコードを作成できます(これはJavaコードではなく、アルゴリズムです):

function compareArrays(int[] array1, int[] array2) {

    if (array1 == null) return false
    if (array2 == null) return false

    if array1.length != array2.length then return false

    for i <- 0 to array1.length - 1
        if array1[i] != array2[i] return false

    return true
}

注:関数はbooleanではなくvoidを返してから、別の変数の戻り値を復元し、それを使用してメッセージ「true」または「false」を出力する必要があります。

public static void main(String[] args) {
    int[] array1;
    int[] array2;
    //initialize the arrays...
    //fill the arrays with items...
    //call the compare function
    boolean arrayEquality = compareArrays(array1, array2);
    if (arrayEquality) {
        System.out.println("arrays are equals");
    } else {
        System.out.println("arrays are not equals");
    }
}
1
Luiggi Mendoza

Apache Commons ArrayUtils#isEquals() メソッドで配列の等価性を確認できます。

1
tstorms

ここで私のアプローチは、他の人に役立つかもしれません。

public static void compareArrays(int[] array1, int[] array2) {
    if (array1.length != array2.length)
    {
           System.out.println("Not Equal");
    }
    else
    {
        int temp = 0;
        for (int i = 0; i < array2.length; i++) {  //Take any one of the array size
            temp^ = array1[i] ^ array2[i];   //with help of xor operator to find two array are equal or not                 
        }
        if( temp == 0 )
        {
             System.out.println("Equal");
        }
        else{
             System.out.println("Not Equal");
        }
    }
}
0
Nayagam