有没有一种方法可以循环输入请求,直到用户满足BigInteger中的条件?

时间:2019-05-23 03:28:57

标签: java

我想做一个循环,重复输入请求,直到用户最终满足数字输入而不是字符串的条件为止。顺便说一下,我在这里使用BufferedReader。有没有办法在BigInteger和BufferedReader中重复它?

mainLoop: while(true) {
            System.out.println("Choose a number:");
            System.out.println("1 - Addition");
            System.out.println("2 - Subtraction");
            System.out.println("3 - Multiplication");
            System.out.println("4 - Division");
            System.out.println("5 - QUIT");

            try {
                int choice = Integer.parseInt(myObj.readLine());

                BigInteger Num1, Num2, sum, diff, qoutient, product;
                String num1 = null, num2 = null;

                switch (choice) {

                case 1: 

                    try {

                        num1 = myObj.readLine();
                        Num1 = new BigInteger(num1);
                        num2 = myObj.readLine();
                        Num2 = new BigInteger(num2);
                        sum = Num1.add(Num2);

                        System.out.println("The answer is "+sum);


                    } catch (NumberFormatException e){

                    }break;

输出实际上返回主循环。

2 个答案:

答案 0 :(得分:0)

更新:

实际上我找到了答案。我做了一会儿循环。

subLoop: while (true) {
                    try {

                        System.out.println("Enter 2 numbers");

                        num1 = myObj.readLine();
                        Num1 = new BigInteger(num1);
                        num2 = myObj.readLine();
                        Num2 = new BigInteger(num2);
                        sum = Num1.add(Num2);

                        System.out.println("The answer is "+sum+ "\n");


                    } catch (NumberFormatException e){
                        System.out.println("Use numbers only.");
                        continue subLoop;
                    }
                    break; 
                }
            continue mainLoop;

答案 1 :(得分:0)

AxelH的建议是保持代码的可读性和可追溯性,就像您要说的那样,对于您的主循环,

boolean keepGoing = true;
while (keepGoing){
//main loop stuff here, and in the case where 5 is chosen, set keepGoing = false
}

请注意,不需要标签。如果您的readLine失败(或者表明您在输入的末尾),则可能还需要将keepGoing设置为false。

我建议您引入两个简单的函数来查看给定的字符串是否为整数:

 public boolean isInteger( String input ) {
    try {
        Integer.parseInt( input );
        return true;
    }
    catch( NumberFormatException e ) {
        return false;
    }
}

public boolean isBigInteger( String input ) {
    try {
        BigInteger t = new BigInteger( input );
        return true;
    }
    catch( NumberFormatException e ) {
        return false;
    }
}

我对输入的工作原理还不太熟悉,因此我不知道是否要循环,直到您有一个不错的选择,然后再担心输入数字。 如果是这样,获得良好的选择循环就像

boolean needAGoodChoice = true;
int choice = 0;
while (needAGoodChoice){
    String numChoice = myObj.ReadLine();
    if (isInteger(numChoice)){
        choice = Integer.parseInt(numChoice);
        //could add check here the number is between 1 and 5 inclusive
        needAGoodChoice=false;
    }
    else{
        System.out.println("Use numbers only for choice.");
    }
}

当结束时,选择就是选择的编号。

相同的逻辑将适用于通过num1和num2字符串将值获取到Num1和Num2 BigIntegers中。

boolean needNums = true;
while (needNums){
  System.out.println("Enter 2 numbers");
  num1 = myObj.ReadLine();
  num2 = myObj.ReadLine();
  if (isBigInteger(num1) and isBigInteger(num2)){
      Num1 = new BigInteger(num1);
      Num2 = new BigInteger(num2);
      needNums=false;
      }
      else{
          System.out.println("Use numbers only for operations.");
      }
}

由于您所有的操作都是二进制操作,所以我想让数字循环进入switch语句之外(在一个用于检查choice> = 1和choice <= 4的if块内),以避免重复4次。 / p>

从本质上讲,它与您的解决方案并没有太大区别,而且看起来很冗长,但是从长远来看,我认为它会更易于维护和遵循。