用句法解析字符串的递归java方法?

时间:2017-02-25 19:14:10

标签: java recursion

java和编程方面的新手。

写了这个递归方法,目的是要求一个既是整数又大于0的有效字符串:

private int getDimension(String tableElement){
    Integer Input= 0;
    System.out.println("Define table rows "+tableElement+"'s."
                       +"Enter an integer >= 1:");

    if( !Reader.hasNextInt() || (Input=Input.parseInt(Reader.nextLine())) <= 0)
        return getDimension(tableElement);
    return Input;
}

我想坚持使用简短的递归方法。它似乎处理&gt; = 0逻辑罚款,但当我传递一个非整数的东西时会爆炸。

有人可以解释为什么会发生这种情况吗?

3 个答案:

答案 0 :(得分:1)

hasNextInt()实际上并不消耗您的输入,因此您在下次调用时会遇到相同的非int输入。

答案 1 :(得分:0)

简单地说,你的代码没有多少(任何?)感觉。

首先,使用要求用户输入的递归方法并不是真的有意义;并且根本不会对传递给它的参数做任何事情!

private int getDimension(String tableElement){
  Integer Input= 0;

糟糕:你继续混合int和`整数。他们不一样。并 - 阅读有关Java编码样式指南。变量名称以小写字母开头!

if( !Reader.hasNextInt() || (Input=Input.parseInt(Reader.nextLine())) <= 0)

第一个条件给出:

true: when there is NO int ... 
false: when there is an int

true导致:再次调用您的方法 而不从阅读器中检索值。

false导致解析int;并检查其值为&lt; = 0。

在一个案例中,您正在进行递归调用;完全忽略了你从读者那里得到的输入;在另一种情况下,你返回0;或输入中的那个值。

解决方案:执行以下操作:

while (true) {
  if (reader.hasNextInt()) {
    input = reader.nextInt();
    break;        
  }
  // there is no number!
  read.nextLine(); // consume & throw away non-number!
  print "Enter a number"
}

代替。

但严肃地说:开始抛弃这段代码。

最后的注意事项:你做Input.parseInt() ...但这是Integer类的静态方法。只需将其称为Integer.parseInt()!但正如所说;抛弃你的代码;并学习如何正确使用该Scanner类;开始阅读here

答案 2 :(得分:0)

因为用户可以输入任何内容,所以您必须始终阅读该行,然后比较它:

String num = Reader.nextLine();
return num.matches("[1-9][0-9]*") ? Integer.parseInt(num) : getDimension(tableElement);

我在这里使用正则表达式来判断它是否为正数;表达式表示&#34; 1-9个字符,后跟0或更多0-9个字符&#34;