Java姓名格式化问题:无Split等工具下的姓名提取逻辑修正
问题描述
需要实现两种姓名格式的提取功能:
- 仅含名和姓时,输出「姓氏,名字首字母」
- 含名、中间名和姓时,输出「姓氏,名字首字母.中间名首字母」
当前使用的Java代码如下,但处理多空格分隔的仅名姓输入(如Phone Apple)时,原条件判断逻辑失效。且禁止使用Split、数组、StringBuffer/StringBuilder,需修正判断逻辑:
public static void main(String[] args) { Scanner input = new Scanner(System.in); String userInput =""; System.out.println("Enter firstName middleName lastName separated by at least one blank, It may have more than one blank separating firstName middleName lastName"); userInput = input.nextLine(); String firstName =""; String middleName =""; String lastName =""; int firstSpace = userInput.indexOf(' '); int secondSpace = userInput.lastIndexOf(' '); firstName = userInput.substring(0,firstSpace); System.out.println("Value of First:"+ firstName + " Second:"+secondSpace); if(secondSpace >= 0)// for if there are only first, last names, which is 2 names { lastName = userInput.substring(secondSpace+1); lastName = lastName.trim(); System.out.println(lastName+ ", " + firstName.charAt(0)); } else// case if input contains 3 names { middleName = userInput.substring(firstSpace+1, secondSpace); middleName = middleName.trim(); lastName = userInput.substring(secondSpace+1,userInput.length()); System.out.println(lastName+", " +firstName.charAt(0)+'.'+middleName.charAt(0)+'.'); } }
修正方案
原逻辑的核心错误是判断条件完全搞反,且未处理名字间的连续空格。正确的判断逻辑应基于「第一个有效空格后,是否还存在第二个有效空格」:
- 先提取名字的第一部分(firstName),并跳过第一个空格后的所有连续空格,定位到下一个非空格字符的起始位置
- 从该位置开始查找下一个空格:
- 若找不到空格,说明只有两个名字(名+姓)
- 若找到空格,说明存在三个名字(名+中间名+姓)
修正后的代码如下:
public static void main(String[] args) { Scanner input = new Scanner(System.in); String userInput = ""; System.out.println("Enter firstName middleName lastName separated by at least one blank, It may have more than one blank separating firstName middleName lastName"); userInput = input.nextLine(); String firstName = ""; String middleName = ""; String lastName = ""; // 找到第一个空格的位置 int firstSpace = userInput.indexOf(' '); firstName = userInput.substring(0, firstSpace).trim(); // 跳过第一个空格后的所有连续空格,定位到下一个名字的起始位置 int startPos = firstSpace + 1; while (startPos < userInput.length() && userInput.charAt(startPos) == ' ') { startPos++; } // 从startPos开始查找下一个空格,区分是两个名字还是三个名字 int nextSpace = userInput.indexOf(' ', startPos); if (nextSpace == -1) { // 仅两个名字:firstName + lastName lastName = userInput.substring(startPos).trim(); System.out.println(lastName + ", " + firstName.charAt(0)); } else { // 三个名字:firstName + middleName + lastName middleName = userInput.substring(startPos, nextSpace).trim(); lastName = userInput.substring(nextSpace + 1).trim(); System.out.println(lastName + ", " + firstName.charAt(0) + '.' + middleName.charAt(0) + '.'); } }
关键逻辑说明
- 通过
while循环跳过连续空格,避免多空格干扰下的位置判断错误 - 使用
indexOf(' ', startPos)从指定位置开始查找空格,准确区分两种输入场景 - 对提取的各姓名部分调用
trim(),避免首尾残留空格
内容的提问来源于stack exchange,提问作者Johnny Song
相关产品推荐
相关产品推荐

