解析全名?

当用户输入多个空格时,我的程序无法正确打印用户名称,例如,如果用户打印出第一个名称后跟2个空格,然后姓氏中间名称则打印为空格并打印最后一个nmae? ? 如何改善这个问题,以便用户输入的额外空间不计入中间名或姓氏?

public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Welcome to the name parser.\n"); System.out.print("Enter a name: "); String name = sc.nextLine(); name = name.trim(); int startSpace = name.indexOf(" "); int endSpace = name.indexOflast(" "); String firstName = ""; String middleName = ""; String lastName = ""; if (startSpace >= 0) { firstName = name.substring(0, startSpace); if (endSpace > startSpace) middleName = name.substring(startSpace + 1, endSpace); lastName = name.substring(endSpace + 1, name.length()); } System.out.println("First Name: " + firstName); System.out.println("Middle Name: " + middleName); System.out.println("Last Name: " + lastName); } 

}

输出:乔标记

 First name: joe Middle name: //this shouldn't print but because the user enter extra spaces after first name the spaces becomes the middle name. Last name: mark 

这一行:

 int endSpace = name.indexOf(" "); 

应该:

 int endSpace = name.lastIndexOf(" "); 

这是因为String.indexOf(char) 返回第一个匹配的索引 ,因此startSpaceendSpace具有相同的值。


实现这一目标的更可靠的方法是分割空白并计算生成的子串的数量。 如果有两个,就没有中间名; 如果有三个 – String[]的第二个项目是中间名称。

例如:

 public static void extractName(String input) { String[] components = input.split("\\s+"); if (components.length == 1) { System.out.println("The pseudonym is: " + components[0].trim()); } else if (components.length == 2) { System.out.println(String.format( "The first name is: %s, last name is: %s ", components[0].trim(), components[1].trim())); } else if (components.length == 3) { System.out .println(String .format("The first name is: %s, middle name is: %s, last name is: %s ", components[0].trim(), components[1].trim(), components[2].trim())); } else { System.out.println(String.format( "\"%s\"? I doubt it's your REAL name", input)); } } public static void main(String[] args) { extractName("Prince"); extractName("John Smith"); extractName("John M. Smith"); extractName("John MJ Smith"); } 

作为使用indexOf的替代方法,请查看String.split方法。

 String[] names = name.split(" "); 

然后你可以根据他们输入的名字来编写你的代码,这样他们就可以只输入他们的名字; 第一和最后; 或者第一,中间和最后。

 int startSpace = name.indexOf(" "); int endSpace = name.indexOf(" "); 

这两个将保持相同的价值。

另外一个选项

简单的解决方案是假设名称有三个部分。

 int endSpace = name.lastIndexOf(" "); 

问题在于这两行:

 int startSpace = name.indexOf(" "); int endSpace = name.indexOf(" "); 

你要

 int endSpace = name.lastIndefOf(" "); 

此外,您缺少嵌套if语句的括号。

startspaceendspace具有相同的值。 因此,

  middleName = name.substring(startSpace + 1, endSpace); 

将给出一个空String

 lastName = name.substring(endSpace + 1, name.length()); 

在第一个空间之后会给出一切

试试这个方法,希望能帮到你。

 String[] components = fullName.split("\\s+"); String firstName = "", middleName = "", lastName = ""; firstName = components[0].trim(); int lastIndex = components.length-1; for (int i = 1; i < lastIndex; i++) { middleName = middleName + components[i].trim() + (i= 1) { lastName = components[lastIndex].trim(); }