我必须解决下一个练习:
创建一个键盘扫描程序,其中标记是无符号整数,并编写代码以确定整数的总和。
注意:-5将被扫描为无符号整数5,减号将作为分隔符跳过
这是我的解决方案(不工作):
import java.util.*;
public class testing{
public static void main( String[] argv ){
testing p = new testing();
}
public testing(){
Scanner myScanner = new Scanner(System.in);
String regex = "\\s+|-";
myScanner.useDelimiter(regex);
int sum = 0;
while(myScanner.hasNextInt()){
int partial = myScanner.nextInt();
sum += partial;
}
System.out.println(sum);
}
}
我的解决方案的问题是它仅适用于正整数或负整数(仅第一个输入)添加到正整数。 例如:
-2
3
4
f (used to stop the program)
将检索9。 但是
3
-2
将停止程序并检索3
我试图了解这种行为的原因,但到目前为止还没有运气。
答案 0 :(得分:5)
你正在使用正则表达式中的OR,这意味着它只消耗换行符然后停在&#39; - &#39;,因为它不再作为分隔符使用。< / p>
扫描仪看到的输入是:
-2 \ N3 \ N4 \ NF
&#39; F&#39;是一个整数之后的第一件事,它与你的空格模式 OR 一个减去。
第二种模式虽然要求两者与你的分隔符匹配:
3 \ N-2
因此,换行符(空格)与您的分隔符模式匹配,并且减号仍然无法匹配。因为它不是Integer .hasNextInt()返回false。
可重复的空格组和减号组按照您的意图运行:
final String regex = "[\\s-]+";
这可能最终会接受超出练习要求的内容,例如数字前面的多个减号。如果这是不可接受的,你当然可以在不确定数量的空格之后将负数限制为一次:
final String regex = "[\\s]*-?";
&#39;?&#39;意味着&#34;曾经或根本不是&#34;并限制了错误的发生。
编辑:
正如@maraca在评论中指出的那样,我之前提出的解决方案仅适用于单位数字,因为模式也接受空字符串。适用于数字&gt; 9的解决方案是:
final String regex = "\\s+|\\s*-";
它的作用是消耗一个或多个空格 OR 零个或多个空格后跟一个减号。
事实证明,像这样的小事情可能很难做到。 -.-
答案 1 :(得分:-1)
你可以通过这样捕捉InputMismatchException
来解决:
public Testing(){
Scanner myScanner = new Scanner(System.in);
String regex = "\\s+|-";
myScanner.useDelimiter(regex);
int sum = 0;
while(myScanner.hasNext()){
int partial = 0;
try{
partial = myScanner.nextInt();
} catch(InputMismatchException e){
continue;
}
sum += partial;
}
System.out.println(sum);
}
问题是你正在尝试解析一个int,但是你收到了一个“ - ”。