2009-07-07 30 views

答えて

5

Arrays.equals()があります。

ハードウェアに対応する命令が存在する場合、JVM実装が実際にこれを最適化するかどうかはわかりませんが、私はそれを疑っています。

また、私のC言語を正しく覚えていれば、strcmpはヌルターミネータ(Cの文字列にとって便利です)まで動作します.JavaプログラマはNull終端配列をめったに気にしないので、配列バージョンは配列全体を比較します。あなたはヌルターミネーターを気にするなら、あなた自身の関数を簡単に書くことができます。

+0

私は誰かが終了ヌルう場合のために好奇心が強いですJavaで独自の配列 –

+0

私はそれを試みたことはありませんが、Cでネイティブメソッドを呼び出してバッファを使用したと仮定します... – Uri

+3

strcmpはどこから来ましたか?問題はmemcmpに関するもので、編集履歴にstrcmpが見えません。 – laalto

1

まあ、Arrays.equals()は良いですが、部分範囲を比較することはできません。この場合、以降のパスもありますが、のようなプリミティブではありません。.subList()です。

実際には直接memcmp()相当はありません。ここにはdiscussionがあり、すぐに私が知っているとすぐに同じ状態になります(15年)。ほとんどの 'ネイティブ'実装は、java.nio.ByteBufferwrap()メソッド、次にequals())を通して私のオプションで実現できます。しかし、それは多少のコード​​量です。

完全に理解できない人対象:memcmp()は、プラットフォームに依存した方法で実装されています。これは非常に効率的で、現在Javaには近づいていません。すべての手動サイクルは、少なくとも索引範囲のチェックのためにパフォーマンスの面で遠く離れています。埋め込みC/C++から来た人々が、このトピックで満足するでしょう。

+0

には、部分範囲に言及するために1が加えられます。その場合、 'Arrays.copyOfRange()'を 'Arrays.equals()'と併用するかもしれませんが、とにかく効率的でない可能性があります。 –

5

Memcmpは、s1の最初のnバイトがそれぞれs2の最初のnバイトより小さいか、一致するか、または大きいことが検出された場合、int、より小さい、等しい、またはより大きいゼロを返します。 Equalsはブール値を返します。それは同じ機能ではありません。さらに、memcmpは、バイトを符号なしの文字として比較します。私は、これは仕事ができると思います

public int memcmp(byte b1[], byte b2[], int sz){ 
    for(int i = 0; i < sz; i++){ 
     if(b1[i] != b2[i]){ 
      if(b1[i] >= 0 && b2[i] >= 0) 
       return b1[i] - b2[i]; 
      if(b1[i] < 0 && b2[i] >= 0) 
       return 1; 
      if(b2[i] < 0 && b1[i] >= 0) 
       return -1; 
      if(b1[i] < 0 && b2[i] < 0){ 
       byte x1 = (byte) (256 + b1[i]); 
       byte x2 = (byte) (256 + b2[i]); 
       return x1 - x2; 
      } 
     } 
    } 
    return 0; 
} 

(編集)実際には 、2の補数の部分は必要ありません。

public static int memcmp(byte b1[], byte b2[], int sz){ 
    for(int i = 0; i < sz; i++){ 
     if(b1[i] != b2[i]){ 
      if((b1[i] >= 0 && b2[i] >= 0)||(b1[i] < 0 && b2[i] < 0)) 
       return b1[i] - b2[i]; 
      if(b1[i] < 0 && b2[i] >= 0) 
       return 1; 
      if(b2[i] < 0 && b1[i] >=0) 
       return -1; 
     } 
    } 
    return 0; 
} 
+0

戻り値1と戻り値-1が逆ではありませんか? –

関連する問題