本文目录导读:

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提供现成方法
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播