6

ある単位を別の単位に変換できるプログラムを書きたいです。2 つのメソッドがあるとします。最初のメソッドはメトリック変換を実行でき、2 番目のメソッドは重み変換を実行できます。例えば;

1. long km=metricConvLength(long mil,Enum.mil,Enum.km);//first method

2. long agirlik=metricConvWeight(long kg,Enum.mil,Enum.km);//second method

これらの変数にEnum構造体を使用したい。私のプログラムは、これらと反対のものを変換できます。

  • 海マイルキロ
  • シーマイルマイル
  • フィートキロ
  • フィートミル
  • ポンド - kg
  • ons-gr
  • inc - cm
  • ヤード - メートル
  • ノットキロ

私の質問:if-else変換にorswitch-case構造体を使用したくありません。これらの構造体を使用してください。これはグラインドです。)

if-else または switch-case を使用せずに、これらの変換のアルゴリズムを作成できますか? 私の目的は、コードを減らし、より多くの作業を行うことです。アルゴリズムに関するヒントはありますか?

4

5 に答える 5

1

「基本」単位となる単位を 1 つ選択します (1 つは重量用、たとえばgr、もう 1 つは距離用、たとえばm )。次に、各値の変換比率を使用してメソッドtoBaseUnitと列挙型を追加します。fromBaseUnit

「if」は関係なく、変換方法は次のようになります。

ResultingUnit.fromBaseUnit(originalUnit.toBaseUnit(value));

サンプル列挙:

public enum Distance {
    METER(new BigDecimal("1.0")), // Base Unit is METER
    KM(new BigDecimal("1E3")),
    CM(new BigDecimal("1E-2"));

    private final static MathContext MC = 
          new MathContext(30, RoundingMode.HALF_EVEN);
    private final BigDecimal conversionRatio;

    Distance(BigDecimal conversionRatio) {
        this.conversionRatio = conversionRatio;
    }

    long fromBaseUnit(BigDecimal baseUnit) {
        return baseUnit.divide(conversionRatio, MC).longValue();
    }

    // returns BigDecimal to avoid rounding two times
    // and possible division by zero
    BigDecimal toBaseUnit(long originalUnit) {
        return BigDecimal.valueOf(originalUnit).multiply(conversionRatio);
    }
}

そして適応された変換方法:

public long metricConvLength(long value, Distance orgUnit, Distance resultUnit) {
    return resultUnit.fromBaseUnit(orgUnit.toBaseUnit(value));
}  

Mapこのアプローチの主な利点は、(ルックアップを回避して列挙値をループすることにより)わずかに高速になることに加えて、より複雑な変換操作(摂氏、華氏、ケルビンを含む列挙型など)が必要な場合にTemperature上書きできることです。列挙値本体。fromBaseUnittoBaseUnit


実施例

精度と丸め動作をより細かく制御するために、変換比率と内部計算にBigDecimalを使用しました。

于 2013-07-09T12:44:05.893 に答える
1

列挙型では、列挙型に fromString メソッドを実装できます。列挙型名が「距離」であるとしましょう

private static final Map<String,Distances> stringToEnum = new HashMap<String,Distances>;

マップを初期化します。

  static{
        for(Distances distance: values()) {
            stringToEnum.put(distance.toString(),distance);
        }
  }

文字列の列挙型を返します:

public static Distances getDistance(String stringValue){
    return stringToEnum.get(stringValue);
}

メソッドでは、次のように渡すことができます。

Distance.getDistance("feet").getCalculatedDistance()
于 2013-07-09T13:12:25.300 に答える