2009-07-07 11 views

Odpowiedz

5

Istnieje Arrays.equals().

Nie wiem, czy implementacja JVM faktycznie optymalizuje to, jeśli istnieje odpowiednia instrukcja w sprzęcie, ale wątpię w to.

Ponadto, jeśli dobrze pamiętam mój C, strcmp działa aż do terminatora o wartości NULL (co czyni go użytecznym dla ciągów C), wersja The Arrays porówna całą tablicę, ponieważ programiści Java rzadko zadają sobie trud z tablicami zakończonymi znakiem NUL. Możesz jednak łatwo napisać własną funkcję, jeśli zależy ci na terminatorze kończącym połączenie.

+0

Jestem ciekawy dla przypadku, gdy ktoś null wypowiedzieć ich własna tablica w Javie –

+0

Nigdy tego nie próbowałem, ale przypuszczam, że gdyby wywołać natywną metodę w C i użyć bufora ... – Uri

+3

Skąd się wziął strcmp? Pytanie dotyczyło memcmp i nie widzę też strcmp w historii edycji. – laalto

1

Cóż, Arrays.equals() jest dobre, ale nie może porównywać podzakresów. W tym przypadku istnieje również ścieżka przez i późniejsza .subList(), ale nie dla elementów podstawowych, takich jak byte[].

W rzeczywistości nie ma bezpośredniego odpowiednika memcmp(). Oto discussion i jak tylko się dowiem, jest już w tym samym stanie (15 lat). Większość "natywnej" implementacji może zostać osiągnięta przez moją opcję za pomocą metody java.nio.ByteBuffer (wrap(), a następnie equals()). Ale jest to dość duża ilość kodu.

Dla osób, które w pełni nie rozumieją tematu: memcmp() jest zaimplementowany w sposób zależny od platformy, co jest bardzo wydajne i nic w Javie aktualnie się do niego nie zbliża. Wszelkie cykle ręczne są daleko w tyle pod względem wydajności, przynajmniej z powodu sprawdzania zakresu indeksów. Może któregoś dnia ludzie, którzy pochodzą z osadzonego C/C++ będą zadowoleni z tego tematu :-).

+0

plus 1, aby wymienić podzakresy. W takim przypadku można użyć 'Arrays.copyOfRange()' z 'Arrays.equals()', ale prawdopodobnie i tak nie będzie wydajne. –

5

Memcmp zwraca wartość int, mniejszą niż, równą lub większą od zera, jeśli pierwsze n bajtów s1 zostanie znalezione, odpowiednio, mniej niż, aby dopasować lub być większe niż pierwsze n bajtów s2. Zwraca wartość boolean. To nie jest ta sama funkcja. Ponadto memcmp porównuje bajty jako niepodpisane znaki.

myślę, że to może działać:

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) W rzeczywistości część dopełnienie przez 2 nie jest konieczne:

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

Czy powrót 1 i powrót -1 nie są odwrócone? –

Powiązane problemy