2012-03-17 48 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