2015-02-23 125 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对象。