2009-07-07 10 views

Antwort

5

Es gibt Arrays.equals().

Ich weiß nicht, ob die JVM-Implementierung dies tatsächlich optimiert, wenn eine entsprechende Anweisung in der Hardware vorhanden ist, aber ich bezweifle es.

Wenn ich mich richtig an C erinnere, arbeitet strcmp mit einem Null-Terminator (was für C-Strings nützlich ist). Die Array-Version vergleicht das gesamte Array, da Java-Programmierer selten mit Null-terminierten Arrays arbeiten. Sie können jedoch leicht Ihre eigene Funktion schreiben, wenn Sie sich für den Null-Terminator interessieren.

+0

Ich bin für einen Fall, neugierig, wo jemand beenden null würde ein eigenes Array in Java –

+0

Ich habe das nie versucht, aber ich würde davon ausgehen, dass, wenn man eine native Methode in C aufgerufen und einen Puffer verwendet ... – Uri

+3

Woher kam strcmp? Die Frage lautete über memcmp, und ich kann strcmp auch nicht in den Bearbeitungsverläufen sehen. – laalto

1

Nun, Arrays.equals() ist gut, kann aber Teilbereiche nicht vergleichen. In diesem Fall gibt es auch einen Pfad durch und später .subList(), aber nicht für Primitive wie byte[].

Eigentlich gibt es keine direkte memcmp() gleichwertig. Hier ist discussion und sobald ich weiß, ist es im selben Zustand (15 Jahre). Die meisten "nativen" Implementierungen konnten durch meine Option java.nio.ByteBuffer (Methode und dann equals()) erreicht werden. Aber es ist etwas großer Code.

Für Leute, die das Thema nicht völlig verstehen: memcmp() ist in plattformabhängiger Weise implementiert, was sehr effizient ist und nichts in Java nähert sich ihm. Alle manuellen Zyklen sind mindestens aufgrund der Indexbereichsüberprüfungen in Bezug auf die Leistung weit entfernt. Vielleicht werden Leute, die von embedded C/C++ kamen, irgendwann mit diesem Thema zufrieden sein :-).

+0

plus 1 für die Erwähnung von Unterbereichen. In diesem Fall könnte man 'Arrays.copyOfRange()' mit 'Arrays.equals()' verwenden, aber wahrscheinlich sowieso nicht effizient. –

5

Memcmp gibt einen int, kleiner als, gleich oder größer als null zurück, wenn die ersten n Bytes von s1 kleiner als, oder größer als die ersten n Bytes von s2 sind. Equals gibt einen booleschen Wert zurück. Es ist nicht die gleiche Funktion. Darüber hinaus vergleicht memcmp Bytes als nicht signierte Zeichen.

ich denke, das funktionieren könnte:

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; 
} 

(edit) In der Tat, die Ergänzung Teil der 2 ist nicht notwendig:

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

Sind die Rückgabe 1 und die Rückgabe -1 nicht umgekehrt? –