2017-01-04 26 views
1

我如何分割線用戶輸入到單獨的字符串和存儲,例如,如果輸入格式如下(爲一個結果圖表)..如何從控制檯分割用戶輸入?

home_name : away_name : home_score : away_score 

我怎麼會去拆分輸入分成4個不同的部分並分開存放? (僅提示用戶輸入上述格式,並且我使用while循環繼續詢問行結果,直到用戶進入停止狀態)。

+4

標記生成器或.split功能 –

+2

像[這](HTTP://計算器.COM /問題/ 3481828 /如何對分裂一弦式的Java)。但是你有沒有控制輸入過程?那個長的字符串似乎很難/容易出錯。 –

+0

不,這是一個問題,我試圖讓我的頭,輸入必須在一行,並在指定的格式,例如一個典型的輸入將看起來像曼徹斯特聯合:切爾西:3:2 – gv555

回答

4

如果輸入數據的格式是一致的,那麼你可以簡單地用一個模式像:並執行以下操作:在這裏我用substring()功能擺脫<>

public static void main(String[] args) { 
    /* Scan Inputs */ 
    Scanner in = new Scanner(System.in); 

    /* Input String */ 
    String input = null; 

    /* Create StringBuilder Object */ 
    StringBuilder builder = new StringBuilder(); 

    String[] headers = { "home_name: ", "away_name: ", "home_score: ", 
      "away_score: " }; 
    while (null != (input = in.nextLine())) { 
     /* Break if user enters stop */ 
     if ("stop".equalsIgnoreCase(input)) { 
      break; 
     } 

     /* Trim the first and the last character from input string */ 
     input = input.substring(1, input.length() - 1); 

     /* Split the input string using the required pattern */ 
     String tokens[] = input.split(" : "); 

     /* Print the tokens array consisting the result */ 
     for (int x = 0; x < tokens.length; x++) { 
      builder.append(headers[x]).append(tokens[x]).append(" | "); 
     } 
     builder.append("\n"); 
    } 

    /* Print Results & Close Scanner */ 
    System.out.println(builder.toString()); 
    in.close(); 
} 

注在使用給定模式分割之前,輸入字符串的開始和結束。

輸入:

<manchester united : chelsea : 3 : 2> 
<foobar : foo : 5 : 3> 
stop 

輸出:

home_name: manchester united | away_name: chelsea | home_score: 3 | away_score: 2 | 
home_name: foobar | away_name: foo | home_score: 5 | away_score: 3 | 
+1

輝煌,我可以以某種方式蠕蟲這個進入一個while循環,以保持提示用戶另一行,直到用戶進入停止? – gv555

+0

@ gv555是的,您可以使用'Scanner'輕鬆地使用控制檯或文件捕捉用戶輸入。請參閱更新的代碼。 – user2004685

+1

非常感謝!最後一個問題,我如何修改輸出?我喜歡它的一行,並且可以在用戶輸入更多結果時使輸出增長,例如,典型的輸出可能看起來像home_name [home_score] | away_name [away_score],它會在輸入結果的同時增加一行。 – gv555

1

在一些情況下,所述輸入可以是有點 '不一致':未設置空白或由新版本產生的變化。如果是這種情況,可以使用正則表達式進行一些保護。

public static void main(String[] args) { 

    boolean validInput = false; 

    String input = "<home_name : away_name : home_score : away_score>"; 

    String pattern = "<.*:.*:.*:.*>"; 
    Pattern r = Pattern.compile(pattern); 
    Matcher m = r.matcher(input); 
    validInput = m.matches(); 

    if(validInput) { 
     input = input.substring(1, input.length() - 1); 
     String tokens[] = input.split("\\s*:\\s*"); 

     for (int x = 0; x < tokens.length; x++) { 
      System.out.println(tokens[x]); 
     } 

    } else { 
     System.out.println("Input is invalid"); 
    } 
} 
+0

有關驗證的其他提示?我想知道如何檢查是否說某個隊名缺失,或者如果其中一個分數不是有效的整數? – gv555

+0

@ gv555我們可以更改正則表達式以避免值的丟失和識別數據類型不一致。該模式可以改變爲這個:'String pattern = <\\ s * \\ S + \\ s *:\\ s * \\ S + \\ s *:\\ s * \\ d + \\ s *: \\ s * \\ d + \\ s *>「;'_新模式在第一個和第二個字段中至少需要一個非空白字符(\ S),並且在第一個字段和第二個字段中至少要有一個十進制數字(\ d)第三和第四場。額外的空格字符是允許的._ –

0

如果格式完全按照你所描述,解析它一個相當有效的方法是這樣的:

public static void main(String[] args) { 
    String line = "<Raptors : T-Rexes : 5 : 10>"; 

    final int colonPosition1 = line.indexOf(':'); 
    final int colonPosition2 = line.indexOf(':', colonPosition1 + 1); 
    final int colonPosition3 = line.indexOf(':', colonPosition2 + 1); 

    final String homeName = line.substring(1, colonPosition1 - 1); 
    final String awayName = line.substring(colonPosition1 + 2, colonPosition2 - 1); 
    final int homeScore = Integer.parseInt(line.substring(colonPosition2 + 2, colonPosition3 - 1)); 
    final int awayScore = Integer.parseInt(line.substring(colonPosition3 + 2, line.length() - 1)); 

    System.out.printf("%s: %d vs %s: %d\n", homeName, homeScore, awayName, awayScore); 
}