我正在写一个小程序,将所有类型的单位转换为其他单位。我有gui和程序工作正常,但我觉得有更好的方法来做,因为我有很多if语句和开关。例如,如果用户想要从一种货币转换为另一种货币,他会使用保管箱选择这两种货币。让我们称他们为fromCurrency
和toCurrency
。 solution
将是最后的结果,amount
是应转换的金额。计算代码如下所示:
double convertIt(String fromCurrency, String toCurrency, double amount, double solution)
switch (fromCurrency) {
case "Euro":
if(toCurrency == "US-Dollar"){
solution = amount*(1.2407);
}
if(toCurrency == "Canadian Dollar"){
solution = amount*(1.5492);
}
// ...
// ... checking all possible currencies in which you could convert, then next case
我知道这对你们大多数人来说可能是非常基本的,但我现在正在努力学习java一段时间,并且想要了解如何有效和优雅地解决问题。因此,我会欣赏任何关于如何更有效地解决这个问题的提示,因为它没有这种感觉,或者至少它不会感觉优雅。例如,10种货币意味着10个开关,每个9个if语句,可能会有更多
答案 0 :(得分:3)
使用Guava's Table
之类的结构。这些允许您将两个值映射到第三个值,就像双条目表一样。
Table<String,String,Double> currencyChanges = HashBasedTable.create();
currencyChanges.put("Euro", "US-Dollar", 1.2407);
currencyChanges.put("Euro", "Canadian Dollar", 1.5492);
...
// Later
Double currencyChange = currencyChanges.get(from, to);
solution = amout * currencyChange;
注意:您应该将BigDecimal
用于货币目的,而不是双打。
答案 1 :(得分:2)
考虑选择基础货币(例如欧元)来计算所有计算。根据每种货币与欧元相比的价值创建enum
:
public enum Currency
{
EUR(1.00),
USD(1.2407),
CAD(1.5492),
// Any other currencies you wish to support
}
然后,只需获取您获得的金额并将其转换为欧元,然后转换为最终货币:
amount *= Currency.USD.ordinal() / Currency.CAD.ordinal();
如果美元是原始货币而CAD是最终货币。
答案 2 :(得分:0)
您应该使用密钥fromCurrency + toCurrency在地图中保存一次,其值为货币汇率
Map<String, Double> currenciesRate = ...
在你的方法中只需获取值
Double rate = currenciesRate.get(fromCurrency + toCurrency);
solution = amount*rate;
最好使用自己的对象作为地图的关键。