Java数组模式匹配实现了吗

wen java案例 2

本文目录导读:

Java数组模式匹配实现了吗

  1. 手动实现数组模式匹配
  2. 使用第三方库
  3. 通用工具方法

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提供现成方法

抱歉,评论功能暂时关闭!