代码之家  ›  专栏  ›  技术社区  ›  Yishai

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

  •  1
  • Yishai  · 技术社区  · 16 年前

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

    我想尽可能使用标准API,确定checker数组中包含的序列是否存在于body数组中的任何位置。

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

    为了获得这里的规模感,checker数组将不会大于48(可能更小),主体最多可能只有几kb。

    4 回复  |  直到 16 年前
        1
  •  3
  •   Jon Skeet    16 年前

    编辑:我要找的是 Boyer-Moore ,但这个答案被添加到了我的手机上,我没时间了:)

    根据数据和您的需求,您可能会发现蛮力方法是绝对好的,而且实现起来比其他方法简单得多 fancier algorithms 可用。简单的暴力方法通常是我的第一个调用端口-它通常被证明是完全足够的:)

        2
  •  4
  •   ColinD    16 年前

    不是在标准图书馆里(就像乔恩·斯基特说的,那里可能没有这样做的东西),而是 Guava 我可以帮你找到方法 Bytes.indexOf(byte[] array, byte[] target) .

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

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

        3
  •  3
  •   Richard Fearn    16 年前

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

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

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

        4
  •  1
  •   David Winslow    16 年前

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