2015-02-23 2 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 двигатель генерирует 'неправильный ответ' ответ.

Кроме того, существует проблема при использовании объекта StringBuilder вместо объекта String в функции postfixString (раньше я использовал объект StringBuilder; возвращал строку с использованием метода toString()).

Пожалуйста, игнорируйте логические несоответствия (я знаю, что есть несколько). Я уже убрал (большинство) из них. Что меня смущает nextLine() vs next() и StringBuilder vs String.

+3

«Я не могу понять контекстное использование». Я не понимаю, о чем вы спрашиваете. 'next()' возвращает следующий токен (по умолчанию разделяется пробелом), а 'nextLine()' возвращает следующую строку. Если вы не покажете нам код с и без 'StringBuilder', я не вижу, как кто-то может помочь вам в этом. –

ответ

1

next() вернет только то, что приходит перед пробелом. nextLine() возвращает текущую строку и перемещает сканер до следующей строки.

1

, если у вас есть пространство между входной строкой, как «(а + Ь) * с», то next метод даст (с последующим тогдашним + тогда б.

Хотя, если вы используете nextLine он будет читать всем строка сразу

String является неизменяемым классом, в то время как StringBuilder не является. Значение Строка, созданная после создания, не может быть изменена. Так как вы делаете «str1» + «str2», он создает три строковых объекта «str1», затем «str2», а затем «str1str2». Если вы используете метод StringBuilder append, вы просто продолжаете добавлять к тому же объекту, а затем в финале один раз, когда вы закончите добавлять строки, вы вызываете toString на StringBuilder, чтобы создать окончательный объект String только один раз.

Смежные вопросы