所以我正在为我的一个类做一个项目,它涉及使用分隔符和其他扫描方法。但是我一直在做很多研究,而我们的书并没有清楚地解释它是如何工作的。因此经过几次头痛并试图理解我认为我会在这里问(编辑:这有点类似我发现[与分隔符和分割数字序列有关]我的老师问我的东西,并认为它足以问我在我被指责在这里完成我的作业之前,我想澄清一下)
这是我到目前为止输入的内容:
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的话,请为我保持愚蠢。感谢。
答案 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)
您的代码存在多个问题:
next()
和nextInt()
方法,这会消耗太多的输入。else
块,因为您将字符串与字符(单引号而不是双引号)进行比较,这些字符总是计算为false。代码:
// 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等)中逐步执行代码,您应该已经发现了这一点。