2012-03-17 49 views
2

我只是有一个关于如何创建高效程序的一般问题。例如,我为Blackberry制作了一个单元转换器程序(The Ultimate Unit Converter,如果你想查看它:)),它可以在5-7个不同的单元之间进行转换。为了对此进行编码,我通过简单地为所有可能的单位创建方法来实施蛮力方式。因此,例如,我创建了以下所有方法:厘米至英寸,厘米至米,英寸至厘米,英寸至米,米至厘米,米至英寸等。如何创建一个高效的货币/单位转换器?

我的问题是:是否有更高效的编码方式?因为当我必须添加一个单元时,它变成一个痛苦,因为那样我就必须创建另一套方法。

谢谢! (对不起,如果我听起来很愚蠢)。

回答

4

简单:只需选择一个“标准”的单位(可以说SI单位)和转换它,并从它。例如,“从英寸到米”,“从米到英寸”,“从厘米到米”,“从米到厘米”等等。要从英寸转换为厘米,只需将“英寸转换为米”,然后“米厘米“。

要添加新设备,您只需要添加2个方法:“NewUnit to meters”和“meters to NewUnit”。

当然,它取决于你如何组织你的方法。例如,你可以有一个以单位为参数的方法。

3

使用国际单位制单位(你可以使用任何一个,但因为大多数单位被定义为SI单位,这是最明智的国际单位)作为其他所有单位的基础和转换因素。

这样,您只需要存储每个单位的一个值,并且可以在最多两个步骤中将单位A转换为B.这是O(N)而不是O(N^2)的天真方法。此外,它允许使用枚举和仅仅一个函数轻松完成此操作。添加更多的单位意味着将该单位添加到枚举和(one!)正确的转换因子

+0

好的,谢谢。我明白。我也将使用这种有效的方式制造货币转换器。 – sameetandpotatoes 2012-03-17 19:39:39

1

是的。

  • 对于每一个类型的测量(例如距离,时间,精力,金钱等),定义一个基座单元。如果SI适用,我建议。否则,选择你想要的。
  • 对于所有支持单位,使两种方法(用面向对象的风格,可以是任何东西虽然)
    1. base to_base_unit()
    2. from_base_unit(base)
  • 为单位的每一次转换,做两步转换。例如。转换abb.from_base_unit(a.to_base_unit())
0

最简单的方法就是决定一个“基本单位”,让我们的长度说meters

如果您将每个单位的方法转换为从米转换而不是全部转换,则可以通过转换x =>米=> y来转换x => y。

当然,这也可以让你存储每个单位的转换因子到米,而不需要做两个以上的功能; to_meters和from_meters。

0

不要重新发明轮子。 JSR 275已被定位解决这个问题,而JScience项目实现了JSR:

Amount<Length> lengthInCm = Amount.valueOf(5, SI.CENTIMETER); 
Amount<Length> lengthInInches = lengthInCm.to(NonSI.INCH); // conversion 

long inches = lenghtInCm.longValue(NonSI.INCH); // unboxing and conversion 
long meters = lenghtInCm.longValue(SI.METER); // unboxing and conversion