【问题标题】:Atoi in Java for negative valuesJava中的Atoi用于负值
【发布时间】:2012-10-26 11:18:21
【问题描述】:

我正在用 Java 编写一个 Atoi 函数。对于 +ve 整数,它运行良好。但是我想要的是当我输入一个负整数时它应该给我一个错误。所以我尝试在我的 Atoi 类中包含 continue 语句。实现的类是:

class Atoi {

    int atoi(String tmp) {

    int result = 0;

        for (int i = 0; i < tmp.length(); i++) {

            char digit = (char)(tmp.charAt(i) - '0');

        if(digit == '-')

        continue;
        }

        else {

            result += (digit * Math.pow(10, (tmp.length() - i - 1)));
        }

    return result;

    }
}   

但不幸的是,它给了我这个字符的负数,即 -12 它给了我 655312!帮助。

编辑:假设我需要检查浮点数我应该怎么做?如果我输入 12.1 或 123.2 它应该分别返回 12.1 和 123.2 !!

【问题讨论】:

    标签: java for-loop negative-number atoi for-else


    【解决方案1】:

    您应该给出错误而不是 continue(抛出异常,return -1 或您所说的“给出错误”)。

    如果您想忽略-,您可以将 else 子句更改为:

    result = digit + result * 10;
    

    【讨论】:

    • +1 这比在每次迭代中使用 Math.pow 更优雅(也更快)。虽然这种想法需要习惯……但真正的问题是,他也确实想处理负数!
    • 假设我需要检查浮点数我应该怎么做?如果我输入 12.1 或 123.2 它应该分别返回 12.1 和 123.2!!
    【解决方案2】:

    快速修复明显问题:逻辑顺序错误...

    代替

        char digit = (char)(tmp.charAt(i) - '0');
        if(digit=='-')
        continue;
    

    试试

        char origChar=tmp.charAt(i);
        if(origChar=='-')
            continue;
        char digit = (char)(origChar - '0');
    

    但是还有两个问题:

    • 如果存在“-”字符,它不会否定该值!
    • 如果这是输入字符串:-1-2-3-4-5,该怎么办?结果会很有趣! 编辑:也试试这个输入:'répa'...更有趣的结果!

    不要忘记使用不正确的输入进行测试,正如@Klaus 建议的那样,如果向函数提供了不正确的输入,请不要犹豫抛出异常(最好是IllegalArgumentException)并提供正确的错误消息...

    【讨论】:

    • 第一种情况已解决..我使用了一个初始化为 0 的变量“负数”。如果出现 -,它会增加 1.. 所以如果负数 ==1,则 - 符号出现在数字..第二个问题仍在试图弄清楚!将在 11 分钟内接受你的回答! ;)
    • 提示:我认为只有第一个字符可以是'-',这个信息可以用...
    • 假设我需要检查浮点数我应该怎么做?如果我输入 12.1 或 123.2 它应该分别返回 12.1 和 123.2!!
    • 你应该检查'.'字符,然后遇到,将分数添加到结果中。
    【解决方案3】:

    如果这不是作为编程练习来完成的,还有一个更简单的解决方案:

      static int atoi(String tmp)
      {
          int result = Integer.parseInt(tmp);
          if(result >= 0) {
             return result;
          } else {
             throw new IllegalArgumentException("Negative string "+"\"" + tmp + "\"");
          }
      }
    

    在否定结果情况下替换适当的异常或其他操作。如果您只想忽略 '-',就像在发布的代码中一样,请将 if-then-else 替换为:

          return Math.abs(result);
    

    此代码还会对“abc”等字符串引发异常。

    更一般地说,如果一个库方法不能完全按照您的要求做,通常很容易在修改其行为的方法中使用它,而不是重新编写它。

    【讨论】:

      【解决方案4】:

      当然,您可以编写这样的代码,但您需要检查 tmp 是否为有效数字。

      int atoi(String tmp) {
      
          int result = 0;
      
          int factor = tmp.charAt(0) == "-" ? -1 : 1;
      
              for (int i = 0; i < tmp.length(); i++) {
      
                  if (tmp.chatAt(i) < '0' ||  tmp.chatAt(i) > '9') 
      
                      continue;
      
                      char digit = (char)(tmp.charAt(i) - '0');
      
                      result += (digit * Math.pow(10, (tmp.length() - i - 1)));
              }
      
              return result * factor;
      }
      

      【讨论】:

        【解决方案5】:
        if(digit=='-')
        

        (char)(tmp.charAt(i)
        

        你的代码假设没有 -'s

        (char)(tmp.charAt(i) - '0');
        

        是一种盲目地将“数字”变量限制为数字的优化。

        您需要逐步了解您的代码实际执行的操作,搜索 ASCII 图表并完成减法 '0' 的作用('0' == 48),因此 '1' (49) - '0 ' (48) = 1 等等...

        【讨论】:

          【解决方案6】:

          如果您不想转换负数,那么只要遇到- 符号就返回0,而不是进一步循环。将此代码放在 if-else 块之前。

               if(tmp.charAt(i)=='-')  
                   return 0;
          

          【讨论】:

          • 这行不通。因为digit 永远不会是-。仔细看一下代码。
          • 可以。但是请引用它,它应该在 if-else 块之前。其实之后就不需要if-else了。
          猜你喜欢
          • 2018-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-02
          • 2018-09-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多