
在处理字符串时,我们经常需要判断一个给定的子字符串(substr)在另一个目标字符串(str)中的具体位置。常见的三种情况是:
许多初学者在尝试同时判断这三种情况时,容易遇到逻辑上的混淆。一个典型的错误在于对 String.contains() 方法的滥用。例如,以下代码片段展示了这种常见误区:
public static void substringProblem() throws FileNotFoundException {
String response;
String answer;
Scanner input = new Scanner(System.in);
System.out.println("Enter a substring: ");
response = input.next();
Scanner inDictionary = new Scanner(DICTIONARY);
for (int line = 1; line <= 23; line++) {
answer = inDictionary.nextLine(); // 原始字符串
if (answer.startsWith(response)) {
answer = answer + " - prefix"; // 第一次修改
}
if (answer.contains(response)) { // 问题所在:如果response是前缀,此条件依然为真
answer = answer + " - infix"; // 导致错误地标记为中缀
}
if (answer.endsWith(response)) { // 同理,如果response是后缀,此条件依然为真
answer = answer + " - suffix";
}
else if (!answer.contains(response)) {
answer = answer + " - not found";
}
System.out.println(answer);
}
}上述代码存在两个主要问题:
为了准确地判断子字符串的位置,我们需要一个更严谨的逻辑,特别是对“中缀”的定义进行明确:一个子字符串只有在目标字符串中存在,且既不是目标字符串的前缀也不是其后缀时,才被认定为中缀。
基于此定义,正确的判断逻辑如下:
立即学习“Java免费学习笔记(深入)”;
这种分层和组合条件的判断方式,确保了每种分类的唯一性和准确性。
以下是一个优化后的Java代码示例,它将核心判断逻辑封装在一个独立的方法中,提高了代码的可读性和复用性:
import java.util.Scanner;
public class SubstringClassifier {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 从控制台获取输入
System.out.print("请输入一个目标字符串: ");
String targetString = scanner.nextLine();
System.out.print("请输入一个要查找的子字符串: ");
String subString = scanner.nextLine();
// 调用分类方法并打印结果
System.out.println(targetString + " " + findSubstringPosition(targetString, subString));
// 示例:可以模拟从字典文件读取并处理
// 假设我们有一个简单的字符串数组作为“字典”
String[] dictionary = {"preload", "helpful", "banana", "nana", "tattarrattat", "absobloominglutely", "apple"};
System.out.println("\n--- 字典处理示例 ---");
for (String word : dictionary) {
System.out.println(word + " " + findSubstringPosition(word, subString));
}
scanner.close();
}
/**
* 判断子字符串在目标字符串中的位置(前缀、后缀或中缀)。
*
* @param str 目标字符串
* @param subStr 要查找的子字符串
* @return 描述子字符串位置的字符串(例如 "-prefix", "-suffix", "-infix", "not found")
*/
public static String findSubstringPosition(String str, String subStr) {
StringBuilder result = new StringBuilder(); // 使用StringBuilder高效构建结果字符串
if (str.contains(subStr)) { // 首先检查是否包含子字符串
boolean isPrefix = str.startsWith(subStr);
boolean isSuffix = str.endsWith(subStr);
if (isPrefix) {
result.append(" -prefix");
}
if (isSuffix) {
result.append(" -suffix");
}
// 只有当既不是前缀也不是后缀时,才标记为中缀
if (!isPrefix && !isSuffix) {
result.append(" -infix");
}
// 如果一个字符串同时是前缀和后缀,但不是中缀(根据此严格定义),
// 并且没有其他标签被添加,则将其视作仅为前缀/后缀的组合。
// 例如 "na" in "nana" 会得到 "-prefix -suffix"
// 如果 str 和 subStr 完全相同,例如 "hello" in "hello",则得到 "-prefix -suffix"
// 注意:此处对 "infix" 的判断是互斥的,即如果已经是前缀或后缀,则不再认为是中缀。
// 如果希望一个字符串即使是前缀或后缀,但其内部也包含子字符串时仍被标记为“infix”,
// 则需要调整逻辑,但通常这种严格定义更为清晰。
} else {
result.append(" -not found"); // 如果不包含
}
// 如果结果为空,说明包含子字符串,但没有被任何特定标签匹配(例如子字符串为空)。
// 针对实际应用,通常subStr不会为空,或者会在输入时进行校验。
if (result.length() == 0 && str.contains(subStr)) {
return " -found (unclassified)"; // 这种情况很少见,除非subStr为空字符串
}
return result.toString().trim(); // 返回结果,并去除可能的前导空格
}
}代码解析:
示例输出(以 subString = "na" 为例):
请输入一个目标字符串: banana 请输入一个要查找的子字符串: na banana -infix --- 字典处理示例 --- preload -not found helpful -not found banana -infix nana -prefix -suffix tattarrattat -infix absobloominglutely -infix apple -not found
通过本教程,我们学习了如何在Java中准确地判断子字符串在目标字符串中的位置。核心在于理解 contains()、startsWith() 和 endsWith() 方法的特性,并结合严谨的逻辑来定义和区分前缀、后缀和中缀。采用模块化的设计和清晰的条件判断,能够编写出健壮且易于理解的字符串处理代码。
以上就是Java子字符串位置判断:前缀、后缀与中缀的精确识别的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号