在 Java 扫描仪中使用 keyboardIn.nextInt() 来忽略'$'符号而不更改 .nextInInt 的最佳方法是什么?



所以这就是我现在拥有的!

int downPayment;
System.out.printf("How much will the down payment be?: ");
Scanner keyboardIn = new Scanner(System.in);
downPayment = keyboardIn.nextInt();
System.out.println(downPayment);

但是,如果我让用户输入" $500",则构建将失败(因为扫描仪仅"扫描"一个整数(。

有没有办法使用 scanner 忽略"整数"的第一个索引,因为我认为让 scanner 将变量视为字符串并在附加第一个索引时将美元值转换为 int 效率非常低。

谢谢!

我认为

让扫描仪将变量视为字符串并在附加第一个索引时将美元值转换为整数效率非常低。

从思考中得出结论是哲学家的,而不是工程师的。

这是您建议的高效版本:

import java.util.*;
class NextInt {
public static void main(String[] args) {
Scanner keyboardIn = new Scanner(System.in);
int downPayment;
for(int i=0; i<10000000; i++) {
downPayment = keyboardIn.nextInt();
}
}
}

这是您提出的超级低效版本:

import java.util.*;
class AsString {
public static void main(String[] args) {
Scanner keyboardIn = new Scanner(System.in);
int downPayment;
for(int i=0; i<10000000; i++) {
String input = keyboardIn.next();
if (input.startsWith("$")) input = input.substring(1);
downPayment = Integer.parseInt(input);
}
}
}

我们可以生成 1000 万行测试数据:

yes '1500' | head -n 10000000 > nodollar
yes '$500' | head -n 10000000 > dollar

现在对其进行基准测试(3 个中最好的(:

$ time java NextInt < nodollar
real    0m3.544s
user    0m3.759s
sys     0m0.124s
$ time java AsString < dollar
real    0m2.530s
user    0m2.735s
sys     0m0.111s

事实证明,我们不仅在谈论每个用户输入节省 ~0.4 微秒时间的上限,而且您将时间和精力花在较慢的实现上。难怪他们说过早优化是万恶之源!

无论如何,这是一个切线,实际上并没有回答这个问题。您是否考虑过使用skip跳过可选$

keyboardIn.skip("[$]?");
downPayment = keyboardIn.nextInt();

与其让您的程序适用于在号码开头输入美元符号的用户,一种选择是更清楚地告诉用户他们应该只输入号码本身。如果在提示符末尾放置$符号,则用户将在该$之后立即键入;任何明智的用户都会意识到他们不应该输入额外的$,因为在屏幕上有两个$标志彼此相邻是明显的错误。

如果有人愚蠢到无论如何都要输入额外的$,让他们看到一条错误消息。

System.out.print("How much will the down payment be?: $");

一个简单的变化。另请注意,您在这里不需要printf,只需print就足够了。

这显然不能处理所有情况,但您可以检查第一个值是否是"$"字符,如果是,请将其删除,然后检查剩余的 String 是否可以解析为 int:

public static void getDownPaymentValue() {
Scanner sc = new Scanner(System.in);
System.out.print("How much will the down payment be?: ");
String input = sc.next();
String validatedInput = validateUserInput(input);
int downPayment = 0;
if(isInteger(validatedInput)) {
downPayment = Integer.parseInt(validatedInput);
} else {
System.out.println("Value is not of type int.");
}
System.out.println("Validated input is: " + validatedInput);
}
public static String validateUserInput(String str) {
int dollarSignIndex = str.indexOf("$");
if(dollarSignIndex == 0) {
str = str.substring(1);
}
return str;
}
public static boolean isInteger(String str) {
try {
Integer.parseInt(str);
return true;
} catch (NumberFormatException e) {
return false;
}
}

您可以使用以下方法之一:

downPayment = Integer.parseInt(keyboardIn.next().replace("$",""));
downPayment = Integer.parseInt(keyboardIn.next().substring(1));

但我不知道这是否是"最好的方法"。


如果你真的必须保留你的 nextInt((,你可以捕获异常:

try {
downPayment = keyboardIn.nextInt();
} catch (InputMismatchException ex) {
// handle it
downPayment = Integer.parseInt(keyboardIn.next().replace("$",""));
}

但我认为通常不建议处理任何运行时异常。

最新更新