【问题标题】:need program logic for unit converter需要单位转换器的程序逻辑
【发布时间】:2013-08-04 01:57:02
【问题描述】:

这是为我的 android 应用 Unit Converter 准备的。我有三个微调器:unitfromto。 例如。角度、度数和弧度。

我为单位微调器添加了一个监听器。选择单位后,fromto 微调器将被填充。用户将在 from EditText 中输入输入,然后按下“计算”按钮,TextView 将包含答案。

我使用if else 实现了这个。

if unit_spinner is Angle
    if from_spinner is Degree
        if to_spinner is Radian
            return input*0.0174532925 //1 degree = 0.0174532925 rad
        else if to_spinner is Gradian
            return input*1.111111111111111 //1 degree = 1.111111111111111 grad

        ...and so on, the cartesian product of all units

这对于多个单位来说变得很长。那么你能提出另一个逻辑吗?

【问题讨论】:

    标签: android algorithm logic unit-conversion


    【解决方案1】:

    按照现在的方式,对于每个包含 N 个单元的类别,您有两个编写 NxN if 语句。

    if from_spinner is Degree
        if to_spinner is Degree
            return input
        if to_spinner is Radian
            return input * 0.0174532925199
        if to_spinner is Gradian
            return input * 1.11111111111
    if from_spinner is Radian
        if to_spinner is Degree
            return input * 57.2957795131
        if to_spinner is Radian
            return input
        if to_spinner is Gradian
            return input * 63.6619772368
    if from_spinner is Gradian
        if to_spinner is Degree
            return input * 0.9
        if to_spinner is Radian
            return input * 0.0157079632679
        if to_spinner is Gradian
            return input
    

    相反,选择一个单元作为输入和输出之间的中介。那么你需要N条if语句从输入转为中介,N条if语句从中介转为输出,一共2N。

    //we will use degrees as the intermediary unit
    intermediary = null
    //caluclate intermediary
    if from_spinner is Degree
        intermediary = input
    if from_spinner is Radian
        intermediary = input * 57.2957795131
    if from_spinner is Gradian
        intermediary = input * 0.9
    
    //calculate final
    if to_spinner is Degree
        return intermediary
    if to_spinner is Radian
        return intermediary / 57.2957795131
    if to_spinner is Gradian
        return intermediary / 0.9
    

    当你只有三个单位时,它似乎效率并不高,但对于较大的 N 值,它会为你节省很多精力。例如,将这个 105 行的双重嵌套方法与使用中间值的 29 行等效方法进行比较:

    if from_spinner is Millimeter
        if to_spinner is Millimeter
            return input
        if to_spinner is Centimeter
            return input * 0.1
        if to_spinner is Meter
            return input * 0.001
        if to_spinner is Kilometer
            return input * 1e-06
        if to_spinner is Inch
            return input * 0.0393700787402
        if to_spinner is Foot
            return input * 0.00328083989501
        if to_spinner is Mile
            return input * 6.2137273665e-07
    if from_spinner is Centimeter
        if to_spinner is Millimeter
            return input * 10.0
        if to_spinner is Centimeter
            return input
        if to_spinner is Meter
            return input * 0.01
        if to_spinner is Kilometer
            return input * 1e-05
        if to_spinner is Inch
            return input * 0.393700787402
        if to_spinner is Foot
            return input * 0.0328083989501
        if to_spinner is Mile
            return input * 6.2137273665e-06
    if from_spinner is Meter
        if to_spinner is Millimeter
            return input * 1000.0
        if to_spinner is Centimeter
            return input * 100.0
        if to_spinner is Meter
            return input
        if to_spinner is Kilometer
            return input * 0.001
        if to_spinner is Inch
            return input * 39.3700787402
        if to_spinner is Foot
            return input * 3.28083989501
        if to_spinner is Mile
            return input * 0.00062137273665
    if from_spinner is Kilometer
        if to_spinner is Millimeter
            return input * 1000000.0
        if to_spinner is Centimeter
            return input * 100000.0
        if to_spinner is Meter
            return input * 1000.0
        if to_spinner is Kilometer
            return input
        if to_spinner is Inch
            return input * 39370.0787402
        if to_spinner is Foot
            return input * 3280.83989501
        if to_spinner is Mile
            return input * 0.62137273665
    if from_spinner is Inch
        if to_spinner is Millimeter
            return input * 25.4
        if to_spinner is Centimeter
            return input * 2.54
        if to_spinner is Meter
            return input * 0.0254
        if to_spinner is Kilometer
            return input * 2.54e-05
        if to_spinner is Inch
            return input
        if to_spinner is Foot
            return input * 0.0833333333333
        if to_spinner is Mile
            return input * 1.57828675109e-05
    if from_spinner is Foot
        if to_spinner is Millimeter
            return input * 304.8
        if to_spinner is Centimeter
            return input * 30.48
        if to_spinner is Meter
            return input * 0.3048
        if to_spinner is Kilometer
            return input * 0.0003048
        if to_spinner is Inch
            return input * 12.0
        if to_spinner is Foot
            return input
        if to_spinner is Mile
            return input * 0.000189394410131
    if from_spinner is Mile
        if to_spinner is Millimeter
            return input * 1609340.0
        if to_spinner is Centimeter
            return input * 160934.0
        if to_spinner is Meter
            return input * 1609.34
        if to_spinner is Kilometer
            return input * 1.60934
        if to_spinner is Inch
            return input * 63359.8425197
        if to_spinner is Foot
            return input * 5279.98687664
        if to_spinner is Mile
            return input
    

    .

    intermediary = null
    if from_spinner is Millimeter
        intermediary = input * 0.001
    if from_spinner is Centimeter
        intermediary = input * 0.01
    if from_spinner is Meter
        intermediary = input * 1.0
    if from_spinner is Kilometer
        intermediary = input * 1000.0
    if from_spinner is Inch
        intermediary = input * 0.0254
    if from_spinner is Foot
        intermediary = input * 0.3048
    if from_spinner is Mile
        intermediary = input * 1609.34
    if to_spinner is Millimeter
        return intermediary / 0.001
    if to_spinner is Centimeter
        return intermediary / 0.01
    if to_spinner is Meter
        return intermediary / 1.0
    if to_spinner is Kilometer
        return intermediary / 1000.0
    if to_spinner is Inch
        return intermediary / 0.0254
    if to_spinner is Foot
        return intermediary / 0.3048
    if to_spinner is Mile
        return intermediary / 1609.34
    

    【讨论】:

      【解决方案2】:

      根据您的变量,您可以使用switch 语句。

      switch(someintegervariable){
        case SOME_INT_CONSTANT_1:
          /* ... */
          break;
        case SOME_INT_CONSTANT_2:
          /* ... */
          break;
        default:
          /* ... */
      }
      

      【讨论】:

      • 您能详细说明一下吗?有三个变量。打开什么?
      • 查看示例,您可以仅打开整数常量(仅限字符串 Java 7+,不适用于 android)。
      • 在您的特殊情况下,您可以先对值类型执行 switch 语句,然后在每个 case 块内依次执行两种情况:首先将 to_value 带到您选择的任何单位(常量),然后使该结果达到目标值。恕我直言,这是最短的方法;但是,如果您需要高精度,则必须执行 3 个嵌套的 switch 语句。
      【解决方案3】:

      我建议使用switch/case 语句。有了这个,您可以为每种单位类型设置一个案例,然后进行计算。

      您还可以为每个计算编写方法。这可能会缩短一点,但可能不会太多。

      我会选择case 声明。它相对简单,但如果您需要帮助,我可以为您整理一些代码。请告诉我。

      这是我可能使用的代码:

      static double DoCalc()
      {
          int uid;
          if unit_roller is Angle
              uid = 1;
          else if unit_roller is Length
              uid = 2;
          //etc...
      
          switch(uid)
              case 1:
                  return AngleCalc(input);
              case 2:
                  return LengthCalc(input);
              //etc...
              default;
      }
      
      static double AngleCalc(double input)
      {
          if (from_spinner == to_spinner)
              return input;
          else if (from_spinner is Degree && to_spinner is radian)
              return input*0.0174532925
          //etc...    
      }
      

      我会说,当我看到它放在一起时,它并没有更短,它确实避免使用嵌套的if 语句,并且当你有大量选项时可能会缩短你的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-07
        • 1970-01-01
        • 2021-12-29
        • 2022-06-15
        • 2017-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多