3

2 つの byte[] 配列の要素を比較する必要がありますが、固定長までしか比較できません。配列全体に使用しますjava.util.Arrays.equals()。もちろん、サブ範囲 ( Arrays.copyOf()) をコピーすることはできますが、そうしたくありません。また、新しいユーティリティ メソッドを実装せずに標準的な方法で行う必要があると確信しています。

正式に必要なのは次のようなものです。

java.util.Arrays.equals(byte[] a, byte [] b, int length)

よく知られている何かのポイントはありますか?広く使用されているアプローチは見当たりません。

再度、誤答を防ぐために求められることについて: - 配列は長さの制限に等しい。- 手動で実装していますが、標準のものに置き換えたいと考えています。- コピーはいらない。

前もって感謝します。

4

5 に答える 5

9

ByteBuffer は、@meriton が提案したものに似たものを提供しますが、プリミティブを操作できます。これが例示的なコードです:

import java.nio.ByteBuffer;

public class Main {

    public static void main(String [] args) throws Exception {

        byte [] a1 = {0, 1, 0, 1};
        byte [] a2 = {0, 0, 1, 0};

        boolean eq = ByteBuffer.wrap(a1,0,3).equals(ByteBuffer.wrap(a2,1,3));
        System.out.println("equal: " + eq);
    }
}

@meriton 回答のプロパティ:

  • 結果は、それらをフルに使用したコレクションです。
  • 実際には多少のコピーです(完全ではありません)。
  • 参照が必要です。プリミティブをこの方法でラップすることはできません。

この答えはスペシャルです。

  • バックエンド配列は決して変更されません。ByteBuffer.array()元の配列への参照を返します(不利になる可能性もあれば、有利になる可能性もあります)。
  • プリミティブで動作します。
于 2013-05-20T14:00:05.060 に答える
7

あなたがすることができます:

Arrays.asList(a).subList(0,n).equals(Arrays.asList(b).subList(0,n))
于 2013-05-20T10:03:59.033 に答える
6

Arrays.equals のソース コードを使用してメソッドを作成できます。

public static boolean equals(byte[] a, byte[] a2, int length) {
        if (a==a2)
            return true;
        if (a==null || a2==null)
            return false;

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

        return true;
    }
于 2013-05-20T10:02:44.443 に答える
1

自分で簡単に実装してみませんか?

public static void firstNEqual(byte[] a, byte[] b, int n) {
    assert a.length >= n && b.length >= n;

    for(int i = 0; i < n; i++)
        if(a[i] != b[i])
            return false;
    return true;
}

ユーティリティ メソッドを組み込む必要があると考える理由は何ですか? 私の状態a[1:4] == b[0:3]Arrays.subrangesEqual(a, b, 1, 0, 3)それは、または明示的な for ループとしてより読みやすいですか:

for(int i = 1, j = 0, count = 0; count < 3; count++, i++, j++)
    if(a[i] != b[j])
        return false;
return true;
于 2013-05-20T10:01:11.093 に答える