2つのbyte[]
アレイがある場合、ala Cのmemcmp()
を比較する組み込み関数がありますか?Javaのmemcmp()に相当しますか?
答えて
Arrays.equals()があります。
ハードウェアに対応する命令が存在する場合、JVM実装が実際にこれを最適化するかどうかはわかりませんが、私はそれを疑っています。
また、私のC言語を正しく覚えていれば、strcmpはヌルターミネータ(Cの文字列にとって便利です)まで動作します.JavaプログラマはNull終端配列をめったに気にしないので、配列バージョンは配列全体を比較します。あなたはヌルターミネーターを気にするなら、あなた自身の関数を簡単に書くことができます。
[をArrays.equals] [1]
[1]:http://java.sun.com/j2se/1.5.0/docs/api/java/util/Arrays.html#equals(byte[]、バイト[])
java.util.Arrays.equals(byte[], byte[])方法はあなたの友達です。
まあ、Arrays.equals()
は良いですが、部分範囲を比較することはできません。この場合、以降のパスもありますが、のようなプリミティブではありません。.subList()
です。
実際には直接memcmp()
相当はありません。ここにはdiscussionがあり、すぐに私が知っているとすぐに同じ状態になります(15年)。ほとんどの 'ネイティブ'実装は、java.nio.ByteBuffer
(wrap()
メソッド、次にequals()
)を通して私のオプションで実現できます。しかし、それは多少のコード量です。
完全に理解できない人対象:memcmp()
は、プラットフォームに依存した方法で実装されています。これは非常に効率的で、現在Javaには近づいていません。すべての手動サイクルは、少なくとも索引範囲のチェックのためにパフォーマンスの面で遠く離れています。埋め込みC/C++から来た人々が、このトピックで満足するでしょう。
には、部分範囲に言及するために1が加えられます。その場合、 'Arrays.copyOfRange()'を 'Arrays.equals()'と併用するかもしれませんが、とにかく効率的でない可能性があります。 –
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;
}
戻り値1と戻り値-1が逆ではありませんか? –
- 1. JavaのC++バリデーションテンプレートに相当します。
- 2. JavaのC++ map.lower_boundに相当します。
- 3. Javaに相当するSystem.Xml.XmlNode.InnerXml
- 4. JavaのRubyの__FILE__に相当しますか?
- 5. JavaのPythonのラムダ関数に相当しますか?
- 6. はC++のjavaの 'classname.this'に相当しますか?
- 7. JavaのC++のstd :: bindに相当しますか?
- 8. Pythonのtoordinal()のJavaに相当しますか?
- 9. java相当のswfobject
- 10. JavaのC#匿名メソッドに相当しますか?
- 11. java APIのLdapCtxFactoryに相当しますか?
- 12. C++のJavaインターフェイスに相当しますか?
- 13. RubyのJavaストリームに相当しますか?
- 14. JavaScriptはGuavaのHashCodeに相当しますか? Javaでは
- 15. JavaのCryptoStream .NETに相当しますか?
- 16. JavaのC++ヘッダーファイルに相当しますか?
- 17. C++ FAQ liteのJava FAQに相当しますか?
- 18. Android Javaのset =およびgetActionCommandに相当しますか?
- 19. Java SWTはWPFのitemtemplateに相当しますか?
- 20. opencv cvCaptureFromFile( "url")はjavaに相当しますか?
- 21. C#OnDeserialized/OnSerializaed Javaに相当しますか?
- 22. php stristr関数javaに相当しますか?
- 23. ファイルベースのjava.util.concurrent.locks.Lockに相当しますか?
- 24. RubyのcURLに相当しますか?
- 25. virtualenvのLuaに相当しますか?
- 26. JMockItのtimes()に相当しますか?
- 27. QTMovieViewのオーディオに相当しますか?
- 28. WP7のデータリストに相当しますか?
- 29. QtのGtkSpinnerに相当しますか?
- 30. マイクロフォーマットのDTDに相当しますか?
私は誰かが終了ヌルう場合のために好奇心が強いですJavaで独自の配列 –
私はそれを試みたことはありませんが、Cでネイティブメソッドを呼び出してバッファを使用したと仮定します... – Uri
strcmpはどこから来ましたか?問題はmemcmpに関するもので、編集履歴にstrcmpが見えません。 – laalto