2009-07-07 2 views

ответ

5

Есть Arrays.equals().

Я не знаю, действительно ли реализация JVM оптимизирует это, если соответствующая инструкция существует в аппаратном обеспечении, но я сомневаюсь.

Кроме того, если я правильно помню свой C, strcmp работает до нулевого терминатора (что делает его полезным для строк C), версия Arrays будет сравнивать весь массив, так как Java-программисты редко беспокоятся о нулевых концах массивов. Вы можете легко написать свою собственную функцию, хотя, если вам небезразличен нулевой ограничитель.

+0

Мне интересно, для случая, когда кто-то Null прекратить их собственный массив в Java –

+0

Я никогда не пробовал это, но я бы предположил, что, может быть, если вы вызвали собственный метод в C и использовали буфер ... – Uri

+3

Откуда появился strcmp? Вопрос был о memcmp, и я тоже не вижу strcmp в истории изменений. – laalto

1

Ну, Arrays.equals() Хорошо, но не может сравнивать поддиапазоны. В этом случае есть также путь через , а затем .subList(), но не для примитивов, таких как byte[].

На самом деле нет прямого memcmp() эквивалента. Вот discussion и как только я знаю, что он находится в том же состоянии уже (15 лет). Большая «нативная» реализация может быть достигнута моим вариантом с помощью метода java.nio.ByteBuffer (wrap(), а затем equals()). Но это несколько большая сумма кода.

Для людей, которые полностью не понимают предмет: memcmp() реализован в зависимости от платформы, который очень эффективен и ничто в Java в настоящее время не подходит к нему. Любые ручные циклы далеки от производительности по крайней мере из-за проверки диапазона индексов. Может быть, когда-нибудь люди, которые пришли из встроенного C/C++, будут удовлетворены на эту тему :-).

+0

плюс 1 для обозначения поддиапазонов. В этом случае можно использовать 'Arrays.copyOfRange()' с 'Arrays.equals()', но, вероятно, неэффективно. –

5

Memcmp возвращает значение, меньшее, равное или большее нуля, если первые n байтов s1 найдены соответственно, чтобы быть меньше, соответствовать или быть больше, чем первые n байтов s2. Equals возвращает boolean. Это не такая же функция. Кроме того, 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 обратный? –