试图用空格分割字符串

时间:2016-10-18 18:05:33

标签: java arrays split delimiter

我写了一段代码,我试图通过使用用户输入的值之间的空格将用户的输入分成3个不同的数组。但是,每次运行代码时我都会收到错误:

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
            at Substring.main(Substring.java:18)
    Java Result: 1

我在输入文本时尝试使用不同的分隔符并且工作正常,例如正常使用/拆分完全相同的输入,并做到我想要它到目前为止做的事情。 任何帮助,将不胜感激! 如果需要,这是我的代码

import java.util.Scanner;

    public class Substring{
    public static void main(String[]args){
    Scanner user_input = new Scanner(System.in);

    String fullname = ""; //declaring a variable so the user can enter their full name
    String[] NameSplit = new String[2];
    String FirstName;
    String MiddleName;
    String LastName;

    System.out.println("Enter your full name (First Middle Last): ");
    fullname = user_input.next(); //saving the user's name in the string fullname

    NameSplit = fullname.split(" ");//We are splitting up the value of fullname every time there is a space between words
    FirstName = NameSplit[0]; //Putting the values that are in the array into seperate string values, so they are easier to handle
    MiddleName = NameSplit[1];
    LastName = NameSplit[2];

    System.out.println(fullname); //outputting the user's orginal input
    System.out.println(LastName+ ", "+ FirstName +" "+ MiddleName);//outputting the last name first, then the first name, then the middle name
    new StringBuilder(FirstName).reverse().toString();
    System.out.println(FirstName);


}

}

4 个答案:

答案 0 :(得分:1)

Split是一个正则表达式,您可以查找一个或多个空格(“+”)而不只是一个空格(“”)。

String[] array = s.split(" +");

或者您可以使用Strint Tokenizer

 String message = "MY name is ";
 String delim = " \n\r\t,.;"; //insert here all delimitators
 StringTokenizer st = new StringTokenizer(message,delim);
 while (st.hasMoreTokens()) {
     System.out.println(st.nextToken());
 }

答案 1 :(得分:0)

你在以下地方犯了错误:

  

fullname = user_input.next();

它应该是nextLine(),而不仅仅是next(),因为您想从扫描仪中读取整行。

  

String [] NameSplit = new String [2];

您不需要执行此步骤NameSplit = user_input.split(...),但它应该是new String[3]而不是new String[2],因为您要存储三个条目,即名字,中间名和姓氏。

这是正确的程序:

class Substring {
    public static void main (String[] args) throws java.lang.Exception {
        Scanner user_input = new Scanner(System.in);
        String[] NameSplit = new String[3];
        String FirstName;
        String MiddleName;
        String LastName;

        System.out.println("Enter your full name (First Middle Last): ");
        String fullname = user_input.nextLine();

        NameSplit = fullname.split(" ");
        FirstName = NameSplit[0];
        MiddleName = NameSplit[1];
        LastName = NameSplit[2];

        System.out.println(fullname);
        System.out.println(LastName+ ", "+ FirstName +" "+ MiddleName);
        new StringBuilder(FirstName).reverse().toString();
        System.out.println(FirstName);
    }
}

输出:

  

输入您的全名(First Middle Last):John Mayer Smith

     史密斯,约翰梅尔

     

约翰

答案 2 :(得分:0)

java.util.Scanner使用分隔符模式将其输入分解为标记,分隔符模式默认匹配空格。 因此,即使您输入'Elvis John Presley',只有'Elvis'存储在fullName变量中。 您可以使用BufferedReader读取完整行:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    try {
        fullname = reader.readLine();
    } catch (IOException e) {
        e.printStackTrace();
    }

或者您可以使用以下命令更改扫描仪的默认行为: user_input.useDelimiter("\n");方法。

答案 3 :(得分:0)

该例外清楚地表明您超出了数组的长度。 2中的索引LastName = NameSplit[2]超出了数组的范围。要摆脱错误,你必须:

1 - String[] NameSplit = new String[2]更改为String[] NameSplit = new String[3],因为数组长度应为3.

在此处阅读更多内容:[How do I declare and initialize an array in Java?]

到目前为止,由于NameSplit[1]NameSplit[2]null,因此错误消失但解决方案仍未正确,因为user_input.next();仅读取第一个字(*基本上直到检测到空格(或者如果只检测到一个单词)。所以:

2 - user_input.next();更改为user_input.nextLine();,因为nextLine()会读取整行(*基本上直到' \ n'是检测的)

在此处阅读更多内容:[http://www.cs.utexas.edu/users/ndale/Scanner.html]