Стандартный способ API, чтобы проверить, содержится ли один массив в другом - PullRequest
1 голос
/ 30 июня 2010

У меня есть два байта [] массивов в методе, подобном этому:

private static boolean containsBytes(byte[] body, byte[] checker){
  //Code you do not want to ever see here.
}

Я хочу, максимально используя стандартный API, определить, существует ли серия, содержащаяся в массиве контролеров, где-либо в массиве body.

Прямо сейчас я смотрю на некоторый неприятный код, который сделал ручной алгоритм. Производительность алгоритма в порядке, и это все, что вы можете сказать о нем. Мне интересно, есть ли более стандартный способ API для этого. В противном случае, я знаю, как написать читабельный ручной.

Чтобы получить представление о масштабе, массив проверок не должен быть больше 48 (возможно, меньше), а тело может быть не более нескольких килобайт.

Ответы [ 4 ]

4 голосов
/ 30 июня 2010

Не в стандартной библиотеке (как сказал Джон Скит, вероятно, ничего такого там нет), но Гуава может помочь вам с его методом Bytes.indexOf (массив байтов [], байт [ ] цель) .

boolean contained = Bytes.indexOf(body, checker) != -1;

Кроме того, такой же метод существует в классах и для других примитивных типов.

3 голосов
/ 30 июня 2010

Вы, вероятно, уже знаете это, но то, что вы пытаетесь (пере) реализовать, - это в основном поиск строки:

http://en.wikipedia.org/wiki/String_searching_algorithm

Старый код может фактически быть реализацией одного из алгоритмов поиска строки; для повышения производительности может быть полезно реализовать один из других алгоритмов. Вы не упомянули, как часто будет вызываться этот метод, что поможет решить, стоит ли это делать.

3 голосов
/ 30 июня 2010

Я ничего не знаю в стандартном API, чтобы помочь вам здесь. В сторонней библиотеке может быть что-то, хотя это может потребоваться реализовать несколько раз, по одному разу для каждого типа примитива: (

РЕДАКТИРОВАТЬ: Я собирался искать Бойер-Мур , но этот ответ был добавлен на моем телефоне, и у меня не хватило времени:)

В зависимости от данных и ваших требований, вы можете обнаружить, что метод грубой силы абсолютно подходит и намного проще в реализации, чем любой из более привлекательных алгоритмов . Простой подход грубой силы, как правило, мой первый порт захода - он часто оказывается вполне адекватным:)

1 голос
/ 30 июня 2010

Каркас коллекций может как дешево оборачивать массив в интерфейсе List, так и искать подсписок.Я думаю, что это будет работать достаточно хорошо:

import java.util.Arrays;
import java.util.Collections;
boolean found = Collections.indexOfSubList(Arrays.asList(body), Arrays.asList(checker) >= 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...