Java 解析全名?
当用户输入多个空格时,“我的程序”无法正确打印用户名,例如,如果用户先打印名字,再打印2个空格,然后打印姓氏,则中间名将打印为空格,最后一个nmae打印??如何改进此问题,以使用户输入的额外空间不计入中间名或姓氏Java 解析全名?,java,Java,当用户输入多个空格时,“我的程序”无法正确打印用户名,例如,如果用户先打印名字,再打印2个空格,然后打印姓氏,则中间名将打印为空格,最后一个nmae打印??如何改进此问题,以使用户输入的额外空间不计入中间名或姓氏 public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Welcome to the name parser.\n");
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
这是因为
String.indexOf(char)
,所以startSpace
和endSpace
具有相同的值
实现这一点的一个更可靠的方法是在空格上进行分割,并计算得到的子字符串的数量。如果有两个,就没有中间名;如果有三个-字符串[]中的第二项是中间名 例如:
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 M. J. Smith");
}
这是因为
String.indexOf(char)
,所以startSpace
和endSpace
具有相同的值
实现这一点的一个更可靠的方法是在空格上进行分割,并计算得到的子字符串的数量。如果有两个,就没有中间名;如果有三个-字符串[]中的第二项是中间名 例如:
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 M. J. Smith");
}
这两个将保持相同的值
另一种选择
简单的解决方案是假设名称由三部分组成
int endSpace = name.lastIndexOf(" ");
这两个将保持相同的值
另一种选择
简单的解决方案是假设名称由三部分组成
int endSpace = name.lastIndexOf(" ");
这一行:
int endSpace = name.indexOf(" ");
应该是:
int endSpace = name.lastIndexOf(" ");
这一行:
int endSpace = name.indexOf(" ");
应该是:
int endSpace = name.lastIndexOf(" ");
问题在于这两条线路:
int startSpace = name.indexOf(" ");
int endSpace = name.indexOf(" ");
你想要
int endSpace = name.lastIndefOf(" ");
另外,嵌套的
if
语句缺少括号。问题在于这两行:
int startSpace = name.indexOf(" ");
int endSpace = name.indexOf(" ");
你想要
int endSpace = name.lastIndefOf(" ");
另外,嵌套的
if
语句缺少括号。startspace
和endspace
具有相同的值。所以,
middleName = name.substring(startSpace + 1, endSpace);
将给出一个空的字符串
lastName = name.substring(endSpace + 1, name.length());
将在第一个空格
startspace
和endspace
后给出所有值。所以,
middleName = name.substring(startSpace + 1, endSpace);
将给出一个空的字符串
lastName = name.substring(endSpace + 1, name.length());
将给出第一个空格后的所有内容,作为使用indexOf的替代方法。请查看该方法
然后,您可以根据他们键入的名称数量编写代码,这样他们就可以只键入自己的名字;第一个也是最后一个;或者第一个、中间和最后一个。作为使用indexOf的替代方法,请查看该方法
然后,您可以根据他们键入的名称数量编写代码,这样他们就可以只键入自己的名字;第一个也是最后一个;或者第一个、中间和最后一个。您永远不会重置结束空间,因为它开始时与startSpace具有相同的值。e、 对于
John'Q'Doe
,它们都指向'n'后面的空格。结束空间不应该是紧靠D
之前的空间吗?您永远不会重置结束空间,它开始时与startSpace具有相同的值。e、 对于John'Q'Doe
,它们都指向'n'后面的空格。结尾空格不应该是D
前面的空格吗?