使用分隔符拆分方程式并运行它

时间:2014-02-12 22:45:54

标签: java delimiter

所以我正在为我的一个类做一个项目,它涉及使用分隔符和其他扫描方法。但是我一直在做很多研究,而我们的书并没有清楚地解释它是如何工作的。因此经过几次头痛并试图理解我认为我会在这里问(编辑:这有点类似我发现[与分隔符和分割数字序列有关]我的老师问我的东西,并认为它足以问我在我被指责在这里完成我的作业之前,我想澄清一下)

这是我到目前为止输入的内容:

import java.io.*;
import java.util.*;
public class addUp
{
   public static void main(String args[]) 
   { 
      Scanner kb = new Scanner(System.in); 
      System.out.print("Enter something like 8 + 33 + 1345 - 137 : "); 
      String s = kb.nextLine( ); 
      Scanner sc = new Scanner(s); 

      /* sc.useDelimiter("\\s*"); With some help and research I found 
         out that the \\s* actually causes every character to be split 
         apart. so 33 is 3 3 */

      int sum = sc.nextInt();
      while(sc.hasNextInt( )) 
      {
         String operator = sc.next();
         int value = sc.nextInt();

         if(operator.equals("-"))
         {
            sum = sum - value;
         }

         else if(operator.equals("+"))
         {
            sum = sum + value;
         }
      } 
      System.out.println("Sum is: " + sum); 
   } 
}

我的最后一次尝试给了我一个奇怪的输出:

 ----jGRASP exec: java addUp

Enter something like 8 + 33 + 1345 - 137 : 8 + 33 + 1345 - 137
Sum is: 8

 ----jGRASP: operation complete.

现在我不知道这一点,我敢肯定,如果我遇到的事情比我们所经历的事情的进展更复杂,我将不会受到赞赏(因为我知道我见过有些人回答其他问题)问题超出了我的理解)。如果你能XD的话,请为我保持愚蠢。感谢。

3 个答案:

答案 0 :(得分:1)

第一个问题(显然在对问题的编辑中得到纠正)

您在每个sc.next()语句中调用if。调用一次,然后在需要时使用该值。如果你继续打电话,你会继续吃你的输入!

String op = sc.next();

if (op.equals('-') {}
else if (op.equals('+') {}
else {}

第二个问题

您永远不会将sum初始化为第一个数字。你完全跳过了第一个数字!这样开始以确保在使用第一个运算符之前使用第一个int

int sum = sc.nextInt();

第三个问题

如果下一个标记为hasNextInt(),则

true仅返回int。如果下一个标记是false"+"之类的运算符,则返回"-"。改变你的时间循环hasNext()

最后一次修复可能会导致您在循环的最后一次迭代中使用"/n"或其他一些行分隔符。就目前而言,看起来这只会导致您打印两次总和。这似乎是你应该能够自己解决的问题。

不要让我多次编辑我的答案四次,尝试在纸上进行此操作,在while循环中进行循环。消耗一个int。消耗一个运营商。消耗一个int。消耗一个运营商。消耗一个int。如果您违反了该顺序,那么您的逻辑顺序不正确。在尝试编写代码之前先了解逻辑。

请阅读Javadoc for Scanner,了解您调用的每种方法实际上是做什么的。了解Streams in Java,以便了解它们的工作原理。

答案 1 :(得分:1)

您的代码存在多个问题:

  1. 您在while循环中多次调用next()nextInt()方法,这会消耗太多的输入。
  2. 总和初始化为0,省略第一个操作数。
  3. 只执行最后一个else块,因为您将字符串与字符(单引号而不是双引号)进行比较,这些字符总是计算为false。
  4. 代码:

    // WRONG: sc.useDelimiter("\\s*");
    int sum = sc.nextInt();  // consume the first token, must be an integer
    while (sc.hasNext()) {   // as long as there are more tokes, do the following
        String operator = sc.next();  // read next token, must be a + or - sign
        int operand = sc.nextInt();   // read next token, must be an integer again
    
        // depending on the arithmetic operator we update the sum variable
        if (operator.equals("-")) {
            sum = sum - operand;
        } else if (operator.equals("+")) {
            sum = sum + operand;
        } else {
            // if the operator variable contains something else than a + or - sign
            // we throw an exception. In general this is the preferred way to avoid
            // that the software changes into an undefined state.
            throw new RuntimeException("Unknown operator: " + operator);
        }
    }
    System.out.println("Sum is: " + sum);
    

答案 2 :(得分:1)

您的代码目前的问题是您的while循环正在检查while(sc.hasNextInt( )),但它期望运算符。将其更改为while(sc.hasNext(),您应该没问题。

此外,遇到这样的问题时,请尝试在调试器中运行代码并单步调试。你会很快看到它没有进入while循环,这将有助于你诊断问题。如果您无权访问调试器,只需输入一些System.out.println()语句即可。

<强>更新

所以,我在调试器中运行你的代码(按照我的描述更改了while循环之后),我注意到的第一件事就是第一次调用sc.nextInt()会返回3,而不是{{ 1}},因为H L解释的原因。删除了对33的调用后,代码运行正常。它现在应该是:

setDelimeter

输出:

import java.io.*;
import java.util.*;

public class addUp
{
   public static void main(String args[]) 
   { 
      Scanner kb = new Scanner(System.in); 
      System.out.print("Enter something like 8 + 33 + 1345 - 137 : "); 
      String s = kb.nextLine( ); 
      Scanner sc = new Scanner(s); 

      //sc.useDelimiter("\\s*"); <-- don't do this
      int sum = sc.nextInt();
      while(sc.hasNext( )) // <-- not hasNextInt
      {
         String operator = sc.next();
         int value = sc.nextInt();

         if(operator.equals("-"))
         {
            sum = sum - value;
         }

         else if(operator.equals("+"))
         {
            sum = sum + value;
         }
      } 
      System.out.println("Sum is: " + sum); 
   } 
}

同样,如果您在调试器(Eclipse,IntelliJ,NetBeans,jdb等)中逐步执行代码,您应该已经发现了这一点。