2010-06-30 2 views
1

에 포함되는 경우이 같은 방법으로 두 바이트 [] 배열을 확인 체커 배열에 포함 된 계열은 본문 배열의 어느 위치 에나 존재합니다.표준 API 방식은 하나 개의 어레이가 다른

지금 당장 나는 손으로 만들어진 알고리즘을 수행 한 일부 불쾌한 코드를보고 있습니다. 알고리즘의 성능은 OK입니다. 여러분이 말할 수있는 전부입니다. 그것을 달성하는 더 표준 API 방법이 있는지 궁금하네요. 그렇지 않으면, 나는 읽을 수있는 손으로 만들어진 것을 쓰는 법을 안다.

여기에서 척도를 얻으려면 검사기 배열이 48보다 크지 않고 (아마 덜) 신체가 최대로 몇 kb 크기 일 수 있습니다.

답변

3

여기있는 데 도움이되는 표준 API에 대해서는 아무 것도 모른다. #

편집 : Boyer-Moore을 찾으려고했는데,이 답변은 제 휴대 전화에 추가되었지만, 제 3 자 라이브러리에는 무언가가있을 수 있지만, 반복적으로 구현해야합니다. 그리고 나는 시간이 없어졌다.

데이터와 요구 사항에 따라 무차별 접근 방식이 유용하며 fancier algorithms보다 더 구현하기가 훨씬 쉽다. 간단한 무차별 대입 방식은 일반적으로 내 첫 호출 포트입니다. 종종 완벽하게 적절하다는 것을 알게됩니다.

+0

손이 :(이다 – Yishai

+0

@Yishai 제작 : :이 합리적으로 잘 작동 할 것이라는 점을 생각한다. 당신이 아니라 정보를 원하시면 ... ColinD의 대답에 따라, –

3

아마도 이미 알고있을 것입니다. 그러나 구현하려고하는 것은 기본적으로 문자열 검색입니다. :

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

는 예전의 코드는 실제로 문자열 검색 알고리즘의 하나의 구현 수 있습니다; 성능 향상을 위해 다른 알고리즘 중 하나를 구현하는 것이 좋습니다. 이 방법을 얼마나 자주 호출해야하는지 언급하지 않았으므로 그 방법을 사용할 가치가 있는지 여부를 결정하는 데 도움이됩니다.

+0

감사 구아바을 체크 아웃 할 수 있습니다 불행하게도 그것이 – Yishai

4

존 스켓 (Jon Skeet)이 말한 것처럼 아마도 여기에는 아무 것도 없지만 Guava은 그 방법이 Bytes.indexOf(byte[] array, byte[] target) 일 때 도움이 될 것입니다.

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

또한 다른 기본 유형의 클래스에도 같은 방법이 있습니다.

+1

구아바가 이걸 가지고 있을지 궁금해했는데 전화로는 쉽게 확인할 수 없었습니다. 좋은 점! –

+0

감사합니다. ColinD, 고마워요. 매우 도움이된다. – Yishai

+0

@Yishai : 이것을 사용하기로 결정했다면 받아 들인 대답 틱을이 대답으로 옮기는 것이 적절할 것이다 :) –

1

컬렉션 프레임 워크는 List 인터페이스에서 배열을 저렴하게 래핑하고 하위 목록을 검색 할 수 있습니다. .

import java.util.Arrays; 
import java.util.Collections; 
boolean found = Collections.indexOfSubList(Arrays.asList(body), Arrays.asList(checker) >= 0; 
+0

방금 ​​샘플로 시도했지만 작동하지 않았습니다. 나는 왜 내 머리 꼭대기에서 떨어져 있는지 모르겠다 ... –

+0

불행히도 Arrays.asList는'List '대신에'List '을 생성하기 때문에 그 방법은 작동하지 않는다. 물론 바이트 []를 루프를 통해'List '으로 변환 할 수 있으므로 표준 API 메소드의 예입니다. +1. – Yishai

+2

왜냐하면'Arrays.asList (byte [])'는 바이트 배열 자체를 포함하고있는 하나의 요소로 된리스트이기 때문입니다. Guava의 Bytes.asList()와 같은 것이 필요합니다. 그러나'indexOfSubList'는 Guava의'Bytes.indexOf()'가 사용하는 것과 같은 무차별적인 힘입니다. –

관련 문제