如何从字符串和整数的文本文件中提取int值?

时间:2017-02-28 03:52:41

标签: java file stack java.util.scanner

我试图编写一个实际上是堆栈的程序。给定一个包含某些关键字的文本文件,我希望我的程序逐行评估文本,并对堆栈执行请求的操作。

例如,如果输入文件是:

push 10 

push 20

push 30

生成的堆栈应如下所示:

30

20

10

但是,我不知道如何将这些值推入堆栈而不在单词push之后对int值进行硬编码。我创建了一个String变量并将其分配给scanner.nextLine()

从那里,我将该行与strLine进行比较:如果strLine等于push后跟一些Number,那么该数字将被推入堆栈。

但是,似乎方法nextInt()不从输入流中获取此数字。

 Scanner input = new Scanner(file)
 int number;
 String strLine;
          while (input.hasNextLine()){
             strLine = input.nextLine();

          number = input.nextInt();
          if(strLine.equals("push " + number)){ 
              stack.push(number);
           }

我该如何解决这个问题?
谢谢。

5 个答案:

答案 0 :(得分:1)

获取输入并将其拆分为空格“”! 这会给[“推”,“1”] 将第一个索引转换为int,然后将值推送到堆栈!

  while (input.hasNextLine()){
          String[] strLine = input.nextLine().split(" ");
          if(strLine[0].equals("push")){
              stack.push(Integer.parseInt(strLine[1]));
          }
          else if(strLine[0].equals("pop")){
              stack.pop();
          }
          else{
              system.out.println("Please enter a valid input!");
           }
  }

希望它有所帮助!

答案 1 :(得分:1)

event.target读取整行,包括数字。您可以做的是使用input.nextLine来获取“推送”,使用input.next()来获取数字。这个例子是使用Scanner和System.in(所以它需要“退出”来退出while循环),但是它也应该使用一个文件(在这种情况下你不需要输入“quit”来退出程序,因为它会在输入文件没有更多输入时自动执行此操作)。使用input.nextInt()(正如其他一些答案所建议的那样)的优点是你可以使用try / catch块捕获整数输入中的任何错误。

parseInt

示例输出:

import java.util.Scanner;
import java.util.Stack;
import java.util.InputMismatchException;

public class StackScanner {
    public static void main(String args[]) {
        Stack<Integer> stack = new Stack<Integer>();

        Scanner input = new Scanner(System.in);
        int number;
        String strLine;
        while (input.hasNext()){
            strLine = input.next();

            if(strLine.equals("push")){
                try {

                    number = input.nextInt();
                    stack.push(number);
                } catch ( InputMismatchException e) {
                    System.out.println("Invalid input. Try again.");
                    input.nextLine();
                    continue;
                }
            } else {
                break;
            }
        }
        System.out.println(stack);
    }
}

答案 2 :(得分:0)

改变这个:

number = input.nextInt();

到此:

number = Integer.parseInt(input.nextLine());

答案 3 :(得分:0)

如果我理解你的问题,我会简单地通过分割空格来对行进行标记。

看起来你的输入是相对有条理的:你有一个关键字,然后是空格,然后是数字。如果您的数据确实属于此结构,请将该行拆分为两个令牌。读取第二个值。例如:

String tokens[] = strLine.split(" ");
// tokens[0] is the keyword, tokens[1] is the value
if(tokens[0].equals("push")){
    // TODO: check here that tokens[1] is an int
    stack.push(Integer.parseInt(tokens[1]));
} else if (tokens[0].equals("pop")) { // maybe you also have pop
    int p = stack.pop();
} else if ... // maybe you have other operations

答案 4 :(得分:0)

nextLine方法解析整行,包括行中的任何数字。因此,您需要注意拆分行并解析代码中的数字。

下面的内容将适用于我用空格分割线条的地方。虽然,有很多这样的方法可能。

    Scanner input = new Scanner(file);
    String strLine;
    Stack<Integer> stack = new Stack<>();
    int number;
    while (input.hasNextLine()){
        strLine = input.nextLine();
        if(strLine.startsWith("push")){ 
            String[] sArr = strLine.split("\\s+");
            System.out.println(strLine);
            if(sArr.length==2){
                number=Integer.parseInt(sArr[1]);
                stack.push(number);
                System.out.println(number);
            }
        }
    }