2016-10-18 3 views
1

사용자가 입력 한 값을 3 개의 다른 배열로 나눠 넣으려는 코드를 작성했습니다. 입력되었습니다. 그러나, 나는이 코드를 실행할 때마다 나는 오류 얻을 : 나는 텍스트를 입력 할 때 다른 구분 기호를 사용하는 것을 시도했다빈 공간이있는 문자열을 분할하려고 시도합니다.

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

을하며, 예를 들어, 좋은 일했다 를 사용하여/똑같은 입력을 정상적으로 분할하고, 지금까지 내가 원했던 것을 수행했습니다. 도움이 될 것입니다.

+0

왜이다 fullname.split ("") 대신 fullname.split ("\\")을 수행 하시겠습니까? 임 확실히 전에 내가 이것을 해 봤고 효과가 있었다. – Addi

+1

그래,하지만 네가 뭘했는지 우리에게 말하지 않았어. 그러니까 .. –

+0

그럴 수는 없어. 내 잘못은 –

답변

0

당신은 실수를 한 사용할 수 있습니다 : 그것은 대신 next()nextLine()을해야

fullname = user_input.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); 
    } 
} 

출력 :

Enter your full name (First Middle Last): John Mayer Smith

Smith, John Mayer

John

+0

첫 번째 값은 0, 두 번째 1, 세 번째 2는 String [2]입니다.하지만 어쨌든 도움에 감사드립니다! –

+0

@ L.Jones28 인덱스가 '0'에서 시작한다는 것을 명심하십시오. 공간을 예약하는 동안 인덱스의 개념은 더 이상 유지되지 않습니다. 따라서 '2'대신 '3'이어야합니다. – user2004685

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); 


} 

을} 필요한 경우 여기 내 코드, 당신은 하나 이상의 공백도 찾아보실 수 있습니다 ("+") 대신에 하나의 공간 ("").

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

또는 당신은 다음과 같은 장소에서 Strint 토크 나이

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()); 
} 
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"); 방법.

0

예외는 배열의 길이를 초과하고 있음을 분명히 알려줍니다. 2LastName = NameSplit[2]에있는 배열의 범위를 벗어났습니다. 당신이해야 오류를 제거하는 :

1 변경 String[] NameSplit = new String[2]String[] NameSplit = new String[3]에 배열 길이가 3를해야하기 때문이다.

읽기 자세한 내용은 여기 : [How do I declare and initialize an array in Java?]

오류가 사라지고하지만 user_input.next();는 기본적으로 공백까지 첫 번째 단어 (*를 읽기 때문에이 솔루션은 정확하지 아직 NameSplit[1]NameSplit[2] 이후 null을 여기에 최대

(또는 한 단어 만있는 경우 '\ n')이 검색됩니다. 그래서 : user_input.nextLine();

2 변경 user_input.next();nextLine() 더 여기 읽기

(감지되는 '\ n을'까지 * 기본적으로) 전체 라인을 읽기 때문에 : [http://www.cs.utexas.edu/users/ndale/Scanner.html]

관련 문제