Java.util.Arrays.equals() с ограниченной длиной
Мне нужно сравнить элементы двух байтовых [] массивов, но только до фиксированной длины.
Для целых массивов я использую java.util.Arrays.equals()
. Конечно, я могу скопировать субдиапазоны (Arrays.copyOf()
), но я бы не хотел этого делать. Я также уверен, что должен быть стандартный способ сделать это без применения новой утилиты.
Мне нужно формально что-то вроде:
java.util.Arrays.equals(byte[] a, byte [] b, int length)
Любая точка к чему-то известному? Я не вижу широко используемого подхода.
Снова о том, что требуется, чтобы предотвратить ложные ответы:
- Массив равен предел по длине.
- У меня есть ручная реализация, но я бы хотел заменить ее чем-то стандартным.
- Я не хочу никакой копии.
Спасибо заранее.
Ответы
Ответ 1
ByteBuffer предоставляет нечто похожее на то, что предложил @meriton, но может работать с примитивами.
Вот иллюстративный код:
import java.nio.ByteBuffer;
public class Main {
public static void main(String [] args) throws Exception {
byte [] a1 = {0, 1, 0, 1};
byte [] a2 = {0, 0, 1, 0};
boolean eq = ByteBuffer.wrap(a1,0,3).equals(ByteBuffer.wrap(a2,1,3));
System.out.println("equal: " + eq);
}
}
Свойства ответа @meriton:
- Результат - это сбор с полной степенью их использования.
- На самом деле это несколько копия (но не полная).
- Требуется ссылки, примитивы не могут быть обернуты таким образом.
Этот ответ подходит.
- Бэкэнд-массив НЕ ИЗМЕНЕН.
ByteBuffer.array()
возвращает
ссылка на исходный массив (может быть недостатком, может быть
преимущество).
- Он работает с примитивами.
Ответ 2
Вы можете сделать:
Arrays.asList(a).subList(0,n).equals(Arrays.asList(b).subList(0,n))
Ответ 3
Вы можете основывать свой метод на исходном коде Arrays.equals.
public static boolean equals(byte[] a, byte[] a2, int length) {
if (a==a2)
return true;
if (a==null || a2==null)
return false;
for (int i=0; i<length; i++)
if (a[i] != a2[i])
return false;
return true;
}
Ответ 4
Почему бы не тривиально реализовать это самостоятельно?
public static void firstNEqual(byte[] a, byte[] b, int n) {
assert a.length >= n && b.length >= n;
for(int i = 0; i < n; i++)
if(a[i] != b[i])
return false;
return true;
}
Почему вы думаете, что должен быть встроен метод утилиты? Что, если мое состояние a[1:4] == b[0:3]
? Является ли это более читаемым как Arrays.subrangesEqual(a, b, 1, 0, 3)
или как явный цикл цикла:
for(int i = 1, j = 0, count = 0; count < 3; count++, i++, j++)
if(a[i] != b[j])
return false;
return true;