检查一个数组是否包含在另一个数组中的标准API方法

时间:2010-06-30 17:59:53

标签: java arrays collections

我在这样的方法中有两个byte []数组:

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

我希望尽可能使用标准API来确定检查器数组中包含的系列是否存在于主体数组中的任何位置。

现在我正在查看一些讨厌的代码,这些代码执行了手工制作的算法。算法的性能还可以,这就是你可以说的一切。我想知道是否有更标准的api方法来实现它。否则,我知道如何编写一个可读的手工制作的。

为了在这里获得比例感,检查器数组不会大于48(可能更少),并且主体最多可能是几kb。

4 个答案:

答案 0 :(得分:4)

不在标准库中(如Jon Skeet所说,可能没有任何内容可以做到这一点),但Guava可以使用方法Bytes.indexOf(byte[] array, byte[] target)帮助您。

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

另外,其他基本类型的类中也存在相同的方法。

答案 1 :(得分:3)

我不知道标准API中的任何内容可以帮助您。第三方库中可能存在某些内容,尽管可能需要重复实现,每种基本类型一次:(

编辑:我打算寻找Boyer-Moore,但是这个答案已经添加到我的手机上了,我没时间了:)

根据数据和您的要求,您可能会发现蛮力方法绝对正确 - 并且比任何可用的fancier algorithms实施起来要简单得多。简单的蛮力方法通常是我的第一个停靠点 - 它通常证明是完全足够的:)

答案 2 :(得分:3)

您可能已经知道这一点,但您尝试(重新)实现的内容基本上是字符串搜索:

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

旧代码实际上可能是其中一个字符串搜索算法的实现;为了获得更好的性能,实现其他算法之一可能会更好。你没有提到这种方法的调用频率,这有助于决定是否值得这样做。

答案 3 :(得分:1)

集合框架既可以廉价地在List接口中包装数组,也可以搜索子列表。我认为这样做会相当不错:

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