【问题标题】:How to utilize a switch statement in this instance?在这种情况下如何使用 switch 语句?
【发布时间】:2016-02-03 00:16:05
【问题描述】:

我正在编写一个程序,将单位(例如 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);
}

}

【问题讨论】:

  • 实际问题是什么?请描述清楚
  • 我在使用 switch 语句来确定将旧测量值转换为新测量值的转换(常量)时遇到问题。
  • 继续你的开始
  • 听起来像是用多态替换条件。

标签: java eclipse unit-testing switch-statement


【解决方案1】:

将两个字符串连接在一起并将其用作您的 case 语句。因此,如果用户输入 oz 进行初始测量,然后输入 g 进行最终测量,您将使用 switch(initial + final) 来生成:ozg。

让你的case语句检查每个:

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

【讨论】:

    【解决方案2】:

    您可以使用输入连接 + 字典来执行此操作,而无需使用 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;
    

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

    【讨论】:

      【解决方案3】:

      我建议你分解你的代码,在不同的类中为每一种测量 1.一个用于身高,体重等..(这会解决你的问题) 这些类中的每一个都可能有一个 map ,它将保存转换单元,例如, kg-lb(key) --> 2.20462(value) m-cm --> 100 等

      您可以放入一个解析器来解析用户输入。用户输入的格式可以是(10 kg to lb)。解析用户输入并创建与地图一起使用的键(kg-lb)并乘以转换单位

      【讨论】:

        【解决方案4】:

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


        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)公共基本单元到目标单元。如果不通过一个共同的基本单位进行转换,除了非常有限数量的单位和类型之外的任何东西都会很快演变成一个不可维护的笛卡尔积,其中包含所有转换因子

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多