本文目录导读:

Java标准库中没有直接提供类似Python或JavaScript中indexOf模式匹配数组子序列的API,你可以通过以下方式实现:
手动实现数组模式匹配
public class ArrayPatternMatching {
// 1. 朴素匹配算法
public static int indexOf(int[] array, int[] pattern) {
if (pattern.length == 0) return 0;
if (array.length < pattern.length) return -1;
for (int i = 0; i <= array.length - pattern.length; i++) {
boolean match = true;
for (int j = 0; j < pattern.length; j++) {
if (array[i + j] != pattern[j]) {
match = false;
break;
}
}
if (match) return i;
}
return -1;
}
// 2. KMP算法(高效实现)
public static int kmpSearch(int[] array, int[] pattern) {
if (pattern.length == 0) return 0;
if (array.length < pattern.length) return -1;
int[] lps = buildLPS(pattern);
int i = 0, j = 0;
while (i < array.length) {
if (array[i] == pattern[j]) {
i++;
j++;
if (j == pattern.length) {
return i - j;
}
} else if (j != 0) {
j = lps[j - 1];
} else {
i++;
}
}
return -1;
}
// 构建部分匹配表(LPS)
private static int[] buildLPS(int[] pattern) {
int[] lps = new int[pattern.length];
int len = 0, i = 1;
while (i < pattern.length) {
if (pattern[i] == pattern[len]) {
len++;
lps[i] = len;
i++;
} else if (len != 0) {
len = lps[len - 1];
} else {
lps[i] = 0;
i++;
}
}
return lps;
}
// 3. 使用Java Stream (仅用于引用类型)
public static <T> int streamIndexOf(T[] array, T[] pattern) {
return java.util.Collections.indexOfSubList(
java.util.Arrays.asList(array),
java.util.Arrays.asList(pattern)
);
}
// 测试
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 3, 4, 5};
int[] pat1 = {3, 4, 5};
int[] pat2 = {6, 7};
System.out.println("朴素匹配: " + indexOf(arr, pat1)); // 2
System.out.println("KMP匹配: " + kmpSearch(arr, pat1)); // 2
System.out.println("未找到: " + indexOf(arr, pat2)); // -1
}
}
使用第三方库
// 使用Apache Commons Lang3
import org.apache.commons.lang3.ArrayUtils;
int[] arr = {1, 2, 3, 4, 5};
int[] sub = {3, 4};
int index = ArrayUtils.indexOf(arr, sub); // 返回2
通用工具方法
public class ArrayUtils {
// 查找所有匹配位置
public static List<Integer> findAll(int[] array, int[] pattern) {
List<Integer> positions = new ArrayList<>();
int index = 0;
while ((index = indexOf(array, pattern, index)) != -1) {
positions.add(index);
index++;
}
return positions;
}
// 带起始位置的搜索
public static int indexOf(int[] array, int[] pattern, int start) {
if (pattern.length == 0) return start;
if (start < 0) start = 0;
for (int i = start; i <= array.length - pattern.length; i++) {
boolean match = true;
for (int j = 0; j < pattern.length; j++) {
if (array[i + j] != pattern[j]) {
match = false;
break;
}
}
if (match) return i;
}
return -1;
}
}
- Java标准库没有原生支持
- 推荐手动实现KMP算法处理大数据
- 简单场景用朴素匹配即可
- 第三方库如Apache Commons提供现成方法