如何在这种情况下使用switch语句?

时间:2016-02-03 00:16:05

标签: java eclipse unit-testing switch-statement

我正在编写一个程序,将单位(例如oz& lb)转换为新的计量单位(g& kg)。我打算让用户输入他们想要转换的单位和原始单位的值。我还设置常量来转换选定的单位。我遇到的问题是使用switch语句来确定我应该使用什么转换(oz ---> g,oz --->等)。

以下是代码:

    System.out.print("Convert from: ");
    String origMeasure = input.nextLine();

    System.out.print("Convert to: ");
    String newMeasure = input.nextLine();

    System.out.print("Value: ");
    double value = input.nextDouble();

    double newValue = 0;

    final double OZ_TO_G = 28.3;
    final double OZ_TO_KG = 0.028;
    final double LB_TO_G = 453.6;
    final double LB_TO_KG = 0.045;
    final double IN_TO_MM = 25.4;
    final double IN_TO_CM = 2.54;
    final double IN_TO_M = 0.0254;
    final double FT_TO_MM = 304.8;
    final double FT_TO_CM = 30.48;
    final double FT_TO_M = 0.3048;

    final String OZ = " oz";
    final String LB = " lb";
    final String IN = " in";
    final String FT = " ft";
    final String G = " g";
    final String KG = " kg";
    final String MM = " mm";
    final String CM = " cm";
    final String M = " m";

    switch(origMeasure){
    case(OZ):
        newValue = (value * OZ_TO_G);
        break;
    }
    System.out.println(value + origMeasure + "=" + newValue + newMeasure);
}

}

4 个答案:

答案 0 :(得分:0)

将两个字符串合并在一起并将其用作case语句。因此,如果用户为初始测量输入oz,然后输入g作为最终测量值,则将切换(初始+最终)以产生:ozg。

让你的案例陈述检查每一个:

String orig = input.next();
    String end = input.next();
    switch(orig + end){
    case "ozg": //DO MATHEMETICAL FUNCTION HERE TO GET RESULT OF OZ --> G
    }
    }

答案 1 :(得分:0)

您可以使用输入连接+字典来执行此操作,而无需使用switch语句。

Dictionary<string, float> conversions = new Dictionary<string, float>();
conversion.add("OZ_TO_KG", 28.3);

System.out.print("Convert from: ");
String origMeasure = input.nextLine();

System.out.print("Convert to: ");
String newMeasure = input.nextLine();

System.out.print("Value: ");
double value = input.nextDouble();

string conversion = origMeasure + "_TO_" + newMeasure;
float rate = conversions[conversion];
double newValue = value * rate;

您必须验证转换是否存在才能不引发异常。

答案 2 :(得分:0)

我建议你在每种测量的不同类别中分解你的代码 1.一个高度,重量等..(这会打破你的问题) 这些类中的每一个都可以具有映射,该映射将保持转换单元,例如, kg-lb(关键) - &gt; 2.20462(值) m-cm - &gt; 100等

您可以放入一个解析用户输入的Parser。用户输入的格式可以是(10 kg到lb)。解析用户输入并创建与地图一起使用的密钥(kg-lb),然后将转换单元相乘

答案 3 :(得分:0)

如果此实用程序是您打算在将来扩展和维护的内容,我建议您使用枚举并通过公共基本单元将转换分为两个步骤:

public enum UnitType
{
    WGT("Weight"),
    DST("Distance");

    public final String title;

    UnitType(String pTitle)
    {
        title = pTitle;
    }
}
public enum Unit
{
    //Weight Units: base unit for all is GM
    GM(UnitType.WGT, BigDecimal.ONE, "Grams"),
    KG(UnitType.WGT, new BigDecimal("1000"), "Kilograms"),
    MG(UnitType.WGT, new BigDecimal("0.001"), "Milligrams"),
    OZ(UnitType.WGT, new BigDecimal("28.3"), "Ounces"),
    LB(UnitType.WGT, (new BigDecimal("16")).multiply(OZ.baseFactor), "Pounds"),

    //Distance Units: base unit for all is MTR
    MTR(UnitType.DST, BigDecimal.ONE, "Meters"),
    MM(UnitType.DST, new BigDecimal("0.001"), "Millimeters"),
    CM(UnitType.DST, new BigDecimal("0.01"), "Centimeters"),
    KM(UnitType.DST, new BigDecimal("1000"), "Kilometers"),
    FT(UnitType.DST, new BigDecimal("0.3048"), "Feet"),
    YD(UnitType.DST, (new BigDecimal("3")).multiply(FT.baseFactor), "Yards"),
    IN(UnitType.DST, FT.baseFactor.divide(new BigDecimal("12"), 10, BigDecimal.ROUND_HALF_UP), "Inches");

    public final UnitType unitType;
    public final BigDecimal baseFactor;
    public final String title;

    Unit(UnitType pUnitType, BigDecimal pBaseFactor, String pTitle)
    {
        unitType = pUnitType;
        baseFactor = pBaseFactor;
        title = pTitle;
    }

    public BigDecimal convert(Unit pTargetUnit, BigDecimal pValue, int pScale)
    {
        if (pTargetUnit.unitType != unitType)
        {
            throw new IllegalArgumentException(getErrorMsg(this, pTargetUnit));
        }
        return pValue.multiply(baseFactor).divide(pTargetUnit.baseFactor, pScale, BigDecimal.ROUND_HALF_UP);
    }

    private static String getErrorMsg(Unit pSourceUnit, Unit pTargetUnit)
    {
        StringBuilder sb = new StringBuilder("Cannot convert ");
        sb.append(pSourceUnit.unitType.title).append(" (").append(pSourceUnit.title).append(") to ");
        sb.append(pTargetUnit.unitType.title).append(" (").append(pTargetUnit.title).append(")");
        return sb.toString();
    }
}

因此用法可能如下所示:

public class UnitConverter
{
    public static void main(String[] args)
    {
        Scanner scanner = new Scanner(System.in);
        while (true)
        {
            System.out.print("Convert from: ");
            String sourceUnitName = scanner.next().toUpperCase();
            if (sourceUnitName.equals("EXIT"))
            {
                break;
            }
            Unit sourceUnit = Unit.valueOf(sourceUnitName);
            System.out.println("Source unit: " + sourceUnit.title + System.lineSeparator());

            System.out.print("Convert to: ");
            String targetUnitName = scanner.next().toUpperCase();
            Unit targetUnit = Unit.valueOf(targetUnitName);
            System.out.println("Target unit: " + targetUnit.title + System.lineSeparator());

            System.out.print("Value: ");
            BigDecimal sourceValue = new BigDecimal(scanner.next());
            BigDecimal targetValue = sourceUnit.convert(targetUnit, sourceValue, 10);
            System.out.println(sourceValue.toString() + " " + sourceUnit.title + " = " + targetValue.toString() + " " + targetUnit.title);
        }
    }
}

这种方法分两步进行转换:1)源单元到公共基本单元,2)公共基本单元到目标单元。如果不通过共同的基本单位进行转换,除了非常有限数量的单位和类型之外的任何东西都会迅速转变为无法维持的全部转换因子的笛卡尔乘积