【问题标题】:How to recurse a String to validate that it contains only numbers after the first character如何递归字符串以验证它在第一个字符之后仅包含数字
【发布时间】:2019-08-19 14:58:00
【问题描述】:

我需要创建一个采用 String 参数的递归方法
我需要验证字符串中的第一个字母是小写字符,然后验证第一个字母之后的所有内容都是数字。

所以应该是这样的a1234

我尝试过创建基本案例、较小的基本案例和一般案例,但似乎无法找到正确的样式:

public void digitCheck(String s) {

   if () //To Check that first character is a letter

   else if ()To check that everything after the first letter is a number

   else //Invalid
}

如果第一个字符是小写字母,之后的所有字符都是数字,我需要代码来报告它是否是有效字符串

示例:
a123 -> 有效
ab123 -> 无效

【问题讨论】:

  • 欢迎来到 SO!提示:尝试跟踪您在字符串中的哪个索引作为递归函数的参数。顺便说一句,这是一个非常人为的问题:IRL,您永远不会逐个字符地检查这样的字符串,因为它会在大字符串上破坏堆栈,而且速度慢且难以推理。像^[A-Za-z]\d*$ 这样的正则表达式对于验证这个属性来说更加简洁。
  • @ggorlen 那么我是否应该添加一个辅助方法,它需要一个额外的参数,例如 (String word, int index),然后在上述方法中调用辅助方法?
  • 这听起来是个好计划!如果您不允许使用帮助程序,请考虑在每次调用时获取字符串的子字符串,基本情况是您的字符串长度为 0,您的 alpha 情况为长度 1,并且每个其他较长的字符串必须匹配最后一个字符数字。
  • 检查字符串中的位置是否为数字的语法是什么? @ggorlen
  • myString.charAt(index);,尽管这是一个练习 google-fu 的好问题(一项非常宝贵的编码技能)。

标签: java string recursion int


【解决方案1】:

我认为您可以省略字符串中的第一个字符,然后使用 Integer.parseInt(String) 进行检查。所以它看起来像:

public static boolean isNumeric(String strNum) {
    try {
        double d = Integer.parseInt(String);
    } catch (NumberFormatException | NullPointerException nfe) {
        return false;
    }
    return true;
}

public void DoStuff(String string){
    if (isNumeratic(string.substring(1)) //ommits first
    {
      ///yourstuff
    }
}

【讨论】:

  • 输入字符串可能太长而无法放入 int,但仍然只包含数字。
【解决方案2】:

使用 String.matches() 方法:

boolean valid = s.matches(".\\d+");

【讨论】:

  • 它不验证第一个字母是小写还是不存在。
  • OP 应该查看 Pattern 以找到完整的正则表达式,例如 "[a-z]\\d+"
【解决方案3】:

为了解决你的模式的递归问题,你可以这样做:

  • 从头到尾
  • 检查最后一个元素
  • 删除最后一个元素
  • 调用所有剩余部分

它应该一直检查直到一个元素被传递给方法 -> 如果它是一个小写字母,则进行最终验证。

另外,StringUtils 类使用来自commons lang 库。

这里是代码sn-p:

public class StringValidationDemo {
    public boolean validateStringRecursive(String str) {
        if (str.length() == 1) {
            return StringUtils.isAlpha(str) && StringUtils.isAllLowerCase(str);
        }

        String lastIndex = str.substring(str.length() - 1);
        return StringUtils.isNumeric(lastIndex)
                && validateStringRecursive(str.substring(0, str.length() - 1));
    }

    public static void main(String[] args) {
        List<String> words = Arrays.asList("a123", "ab123", "123ab", "A123", "aaa", "123");

        StringValidationDemo demo = new StringValidationDemo();
        for (String word : words) {
            System.out.printf("validation for: %s = %s\n",
                    word, demo.validateStringRecursive(word));
        }
    }
}

输出:

validation for: a123 = true
validation for: ab123 = false
validation for: 123ab = false
validation for: A123 = false
validation for: aaa = false
validation for: 123 = false

【讨论】:

  • 对于这个问题,我很遗憾不得不使用递归,并且不允许其他任何事情
  • @UltamaniaHD 我用递归解决方案更新了答案。
猜你喜欢
  • 1970-01-01
  • 2012-09-07
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多