【问题标题】:Alternative to this code in JavaJava 中此代码的替代方案
【发布时间】:2013-11-30 22:48:14
【问题描述】:

所以我为我的 AP 计算机科学课程编写了一些代码,但我的老师要求我不要在我的代码中使用 char 或 token。我特别有这个代码,我需要一个替代(非字符)版本。

// returns the first nonzero digit of a string, 0 if no such digit found
    public static int firstDigitOf(String token) {
        for (char ch : token.toCharArray()) {
            if (ch >= '1' && ch <= '9') {
                return ch - '0';
            }
        }
        return 0;
    }

所以是的,请帮助我。这不是家庭作业,它是大型项目的一部分,因此特别感谢整行代码。

or (char ch : token.toCharArray()) {

这是我最麻烦的,我只是不知道另一种写法。

【问题讨论】:

  • 字符串是由字符组成的,如果你不想使用字符,你必须不使用字符串。相反,您可以使用 byte[].
  • 你的代码看起来非常好,顺便说一句。
  • token 只是一个变量名。他的意思是您不应该将输入字符串转换为 CharArray 或使用任何基于字符的方法吗?
  • 你可以用正则表达式来做,但我不推荐它。您编写它的方式既高效又清晰。但是,您的任务似乎不是编写好代码,而是解决难题。正则表达式应该能够提取单个字符,而无需编写循环或触摸单个字符值。
  • 他可能希望你使用substring() 并可能使用递归。

标签: java optimization coding-style


【解决方案1】:

你可以用这个

String token = "helo100s23h04dsd sdksjdksa";
token = token.replaceAll("[^1-9]", "");
 // in this case token value will be -> 1234, and the first none zero digit is 1
 if (token.length() <= 0) {
  // if there is no numbers in token larger than 0
    return 0;
   } else {
   return Character.getNumericValue(token.charAt(0));
 }

【讨论】:

  • 你应该删除我认为“token == null”的这个检查。这是没用的,不是吗?如果它为空,你会更早得到 NPE,对吧?
  • 如果第一个数字是 1,这将返回整数值 0x31。原始代码减去“0”得到 1。
  • 是的,如果你注意到它返回的是它自己的字符,而不是它的整数值。
  • 好的,我已经修改了代码,所以现在它返回字符的 int(数字)值。
【解决方案2】:

如果输入字符串全是数字,这将起作用:

public static int firstDigitOf(String digits) {
    if (digits.length() == 0)
        return 0;
    int firstDigit = Integer.parseInt(digits.substring(0, 1));
    if (firstDigit > 0)
        return firstDigit;
    return  firstDigitOf(digits.substring(1));
}

迭代版本:

public static int firstDigitOf(String digits) {
    int firstDigit = 0;
    while (digits.length() != 0) {
        firstDigit = Integer.parseInt(digits.substring(0, 1));
        if (firstDigit > 0)
            break;
        digits = digits.substring(1);
    }
    return  firstDigit;
}

如果字符串可能有非数字,你需要这样做:

public static int firstDigitOf(String token) {
    if (token.length() == 0)
        return 0;
    try {
        int firstDigit = Integer.parseInt(token.substring(0, 1));
        if (firstDigit > 0 && firstDigit < 10)
            return firstDigit;
    } catch (NumberFormatException e) {
    }
    return  firstDigitOf(token.substring(1));
}

【讨论】:

    【解决方案3】:

    我想出了以下内容:

    public Integer firstDigitOf(String s) {
        s=s.replaceAll("[^1-9]","");
        return (s.isEmpty())?0:Integer.parseInt(s.substring(0,1));
    }
    

    只需替换所有非数字内容并给出 0 或第一位数字。

    【讨论】:

    • 我认为这是不对的。如果字符串是“0001234”怎么办?
    • 是的,它说“非零”... g
    【解决方案4】:

    本着矫枉过正的精神,这里有一个正则表达式版本。请注意,直接使用 char 是没有用的 - 都是用 String 完成的。

      private static Pattern nonZeroDigit = Pattern.compile("[123456789]");
    
      public static int firstDigitOf(String token) {
        Matcher digitMatcher = nonZeroDigit.matcher(token);
        if (digitMatcher.find()) {
          return Integer.parseInt(digitMatcher.group());
        } else {
          return 0;
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-23
      • 2012-07-26
      • 2013-03-10
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多