2015-02-23 97 views
1

我承認,我已經經歷了很多(類似)的問題,但我似乎無法理解下面這段代碼中的上下文用法一個基本的問題SPOJ(http://www.spoj.com/problems/ONP/):掃描儀方法:next()vs nextLine()

import java.io.*; 
import java.util.Stack; 
import java.util.Scanner; 


public class onp1 { 

    public static String postfixString(String expression) { 

     // Stack <Character> valueStack = new Stack <Character>(); 
     Stack <Character> operatorStack = new Stack <Character>(); 
     String output = ""; 
     char[] tokens = expression.toCharArray(); 

     for(char c : tokens) { 

      if(c == '('){ 
       continue; 
      } 

      else if(c == '+' || c == '-' || c == '*' || c == '/' || c == '^') { 
       operatorStack.push(c); 
       continue; 
      } 

      else if(c == ')') { 
       output += operatorStack.pop(); 

       continue; 
      } 

      else { 
        output += String.valueOf(c); 
       continue; 
      } 
     } 
     return output; 
    } 
    public static void main (String [] args)throws java.lang.Exception { 

     String inputString = ""; 
     int n1; 
     Scanner in = new Scanner(System.in); 
     try 
     { 
      n1 = in.nextInt(); 
      StringBuilder[] sb = new StringBuilder[n1]; 
      for(int i = 0; i < n1; i++) { 

       sb[i] = new StringBuilder(); 



       inputString = in.next(); 

       sb[i].append(postfixString(inputString)); 

      } 


      for(int i = 0; i < n1; i++) { 
       System.out.println(String.valueOf(sb[i])); 
      } 
     } 
     catch (Exception e) { 
      // System.out.println(""); 
      System.out.println(e.getMessage());  
      // numberOfTestCases.next(); 
     } 
     System.exit(0); 
    } 

} 

如果我使用nextLine(),而不是下一個()時,SPOJ引擎生成一個 '錯誤答案' 的迴應。

此外,在postfixString函數中使用StringBuilder對象而不是String對象似乎存在一些問題(我之前使用StringBuilder對象;使用'toString()'方法返回字符串)。

請忽略邏輯不一致(我知道有幾個)。我已經把它們中的大部分都解僱了。讓我瘋狂的是nextLine() vs next()和StringBuilder vs String問題。

+3

「我似乎無法理解上下文的用法」我不明白你在問什麼。 'next()'返回下一個標記(默認情況下用空格分隔),'nextLine()'返回下一行。除非你向我們展示帶或不帶'StringBuilder'的代碼,否則任何人都無法幫助你。 – 2015-02-23 17:18:31

回答

1

next()只會返回空格前的內容。 nextLine()返回當前行並將掃描儀向下移動到下一行。

1

,如果你在你的輸入字符串之間有空格,如「(A + B)* C」則next方法會給(後面跟一個那麼+則b。

而如果你使用nextLine它會讀取整line一次

String是一個不可變的類,而StringBuilder不是。含義字符串一旦創建就無法改變,所以當你做「str1」+「str2」時,它會創建三個字符串對象「str1」然後是「str2」,然後是「str1str2」;如果你使用StringBuilder的方法,你只需要繼續添加到同一個對象,然後在最後一次添加字符串時,你可以調用StringBuilder上的只創建一次最終的String對象。