android - 需要单位转换器的程序逻辑

标签 android algorithm logic unit-conversion

这是我的 Android 应用程序单位转换器。我有三个微调器:unitfromto。 例如。角度、度数和弧度。

我为单元微调器添加了一个监听器。选择单位后, 微调器将被填充。用户将在 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

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

最佳答案

按照你现在的方式,你有两个写 NxN if 语句的每个类别都有 N 个单位。

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

关于android - 需要单位转换器的程序逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18022944/

相关文章:

android - 调试android数据绑定(bind)?

java - 将 ArrayList<Uri> 保存到 SharedPreferences

python - 有没有一种简单的方法来获得 utf8 编码字符串的子字符串,子字符串的 repr 长度小于 python 中的 N

python - 从Python中的字典中删除值

android - Delphi Firemonkey TControl.MakeScreenshot 可以在线程中工作吗?

java - 在新的 Android Studio 中初始化 Stripe 对象

c# - 确定字符串是否为合法 XML 元素名称的有效方法

c++ - 返回排序数组中重复数字计数的函数

javascript - 逻辑: Make mechanism to parse a javascript array until each row has been taken under account

sql - 基于以前的值更新 SQL SERVER 2005