杰瑞科技汇

Java字符串中如何统计子串出现次数?

Java 字符串中子串出现次数的统计方法

在 Java 中,统计一个字符串中子串出现的次数有几种常见方法,以下是几种实现方式:

Java字符串中如何统计子串出现次数?-图1
(图片来源网络,侵删)

使用 String.indexOf()

public static int countSubstring(String mainStr, String subStr) {
    if (mainStr == null || subStr == null || mainStr.length() == 0 || subStr.length() == 0) {
        return 0;
    }
    int count = 0;
    int index = 0;
    while ((index = mainStr.indexOf(subStr, index)) != -1) {
        count++;
        index += subStr.length();
    }
    return count;
}

使用正则表达式

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public static int countSubstringRegex(String mainStr, String subStr) {
    if (mainStr == null || subStr == null || mainStr.length() == 0 || subStr.length() == 0) {
        return 0;
    }
    Pattern pattern = Pattern.compile(Pattern.quote(subStr));
    Matcher matcher = pattern.matcher(mainStr);
    int count = 0;
    while (matcher.find()) {
        count++;
    }
    return count;
}

使用 Java 8 Stream API

import java.util.regex.Pattern;
public static int countSubstringStream(String mainStr, String subStr) {
    if (mainStr == null || subStr == null || mainStr.length() == 0 || subStr.length() == 0) {
        return 0;
    }
    return Pattern.compile(Pattern.quote(subStr))
                 .matcher(mainStr)
                 .results()
                 .mapToInt(m -> 1)
                 .sum();
}

递归方法(不推荐,仅作示例)

public static int countSubstringRecursive(String mainStr, String subStr) {
    if (mainStr == null || subStr == null || mainStr.length() == 0 || subStr.length() == 0) {
        return 0;
    }
    int index = mainStr.indexOf(subStr);
    if (index == -1) {
        return 0;
    }
    return 1 + countSubstringRecursive(mainStr.substring(index + subStr.length()), subStr);
}

注意事项

  1. 这些方法都是区分大小写的,如果需要不区分大小写,可以在查找前将字符串转换为小写:

    mainStr = mainStr.toLowerCase();
    subStr = subStr.toLowerCase();
  2. 如果子串为空字符串,上述方法可能会返回异常结果,因此需要添加空值检查。

  3. 对于重叠的子串(如 "aaa" 中 "aa" 出现了两次),方法一会统计重叠情况,而正则表达式方法默认不会统计重叠情况。

示例使用

public static void main(String[] args) {
    String main = "ababababab";
    String sub = "aba";
    System.out.println(countSubstring(main, sub)); // 输出 3
    System.out.println(countSubstringRegex(main, sub)); // 输出 3
    System.out.println(countSubstringStream(main, sub)); // 输出 3
}

选择哪种方法取决于你的具体需求和性能考虑,对于大多数情况,方法一(使用 indexOf)是最简单直接的选择。

Java字符串中如何统计子串出现次数?-图2
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇