1

当用户输入多个空格时,我的程序无法正确打印出用户名,例如,如果用户打印名字后跟 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 
4

6 回答 6

5

那是因为String.indexOf(char) 返回第一个 match 的索引,所以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  M. J. Smith");
}
于 2013-04-15T17:31:11.367 回答
5

这一行:

int endSpace = name.indexOf(" ");

应该:

int endSpace = name.lastIndexOf(" ");
于 2013-04-15T17:31:31.360 回答
4

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

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

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

于 2013-04-15T17:33:04.533 回答
2
int startSpace = name.indexOf(" ");
int endSpace = name.indexOf(" ");

这两个将保持相同的值。

另外一个选项

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

int endSpace = name.lastIndexOf(" ");
于 2013-04-15T17:31:18.603 回答
2

问题在于这两行:

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

你要

int endSpace = name.lastIndefOf(" ");

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

于 2013-04-15T17:32:14.607 回答
1

startspaceendspace具有相同的价值。所以,

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

会给一个空的String

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

将在第一个空格之后给出所有内容

于 2013-04-15T17:32:16.737 回答