2009-07-07 12 views

risposta

5

C'è Arrays.equals().

Non so se l'implementazione JVM in realtà lo ottimizzi se esiste un'istruzione corrispondente nell'hardware, ma ne dubito.

Inoltre, se ricordo correttamente il mio C, strcmp funziona con un terminatore nullo (rendendolo utile per le stringhe C), la versione Array confronta l'intero array poiché i programmatori Java raramente si preoccupano di array con terminazione nulla. Potresti scrivere facilmente la tua funzione, se ti interessa il terminatore null.

+0

Sono curioso per un caso in cui qualcuno avrebbe su null terminare il proprio array in Java –

+0

Non l'ho mai provato, ma suppongo che forse se si invocasse un metodo nativo in C e si usasse un buffer ... – Uri

+3

Da dove proviene lo strcmp? La domanda riguardava memcmp e non riesco a vedere strcmp nelle cronologie di modifica. – laalto

1

Bene, Arrays.equals() è buono, ma non è possibile confrontare i reindirizzamenti. In questo caso c'è anche il percorso attraverso e successivamente .subList() ma non per primitive come byte[].

In realtà non esiste un equivalente diretto memcmp(). Ecco discussion e non appena so che è nello stesso stato ormai (15 anni). La maggior parte dell'implementazione "nativa" potrebbe essere ottenuta tramite la mia opzione tramite java.nio.ByteBuffer (metodo wrap() e quindi equals()). Ma è un po 'una grande quantità di codice.

Per le persone che non comprendono completamente il soggetto: memcmp() è implementato in modo dipendente dalla piattaforma che è molto efficiente e nulla in Java al momento si sta avvicinando. Tutti i cicli manuali sono molto distanti in termini di prestazioni, almeno a causa dei controlli di intervallo dell'indice. Forse un giorno le persone che provengono da embedded C/C++ saranno soddisfatte su questo argomento :-).

+0

più 1 per aver menzionato le subranges. In tal caso si potrebbe usare 'Arrays.copyOfRange()' con 'Arrays.equals()' ma probabilmente non efficiente in ogni caso. –

5

Memcmp restituisce un valore int, minore di, uguale ao maggiore di zero se i primi n byte di s1 sono trovati, rispettivamente, per essere inferiori, per corrispondere o essere maggiori dei primi n byte di s2. Equals restituisce un valore booleano. Non è la stessa funzione. Inoltre, memcmp confronta i byte come caratteri non firmati.

credo che questo potrebbe funzionare:

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) Infatti, il 2 della parte complemento non è necessario:

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

Non sono il ritorno 1 e restituiscono -1 invertito? –