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

问题描述 投票:0回答:4

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

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',则构建将失败(因为扫描程序仅扫描整数)。

是否有一种使用扫描仪的方式,它会忽略“整数”的第一个索引,因为我认为让扫描仪将变量视为字符串并将附加第一个索引的美元值转换为int超级效率低下。

谢谢!

java java.util.scanner
4个回答
3
投票

[我认为让扫描程序将变量视为字符串并将附加第一个索引的美元值转换为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);
    }
  }
}

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

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.2微秒的时间,而且您也在slower实现上花费时间和精力。难怪他们说过早的优化是万恶之源!

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

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

1
投票

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

如果任何人都足够傻,无论如何都要键入一个额外的$,让他们看到错误消息。

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

一个简单的更改。还请注意,这里不需要printf,仅需要print就可以了。


0
投票

这显然不能处理所有情况,但是您可以检查第一个值是否为'$'字符,如果是,则将其删除,然后检查是否可以将剩余的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;
        }
    }

0
投票

您可以使用以下之一:

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("$",""));
}

但是我一般不建议处理任何RuntimeException。

© www.soinside.com 2019 - 2024. All rights reserved.