首页 > 解决方案 > 方法不适用于数组的所有元素

问题描述

更新

我需要指导。目标是显示温度的转换。输入在命令行由一个字符组成,f(代表华氏度)或 c,后跟一系列整数(例如 f 100 250 98),然后将其存储在整数数组中。

输出应为“转换为摄氏度 xy z 的整数”。我下面的内容不能正确转换整数(位于命令行 args[1]、args[2]、...)。我运行输入的命令行参数“f 1500”,显示的结果是“1 个整数转换为摄氏度:-17.2”。-17 摄氏度是 0 华氏度,这显然是不正确的。

我想要关于我做错了什么的指导。我不需要实际的代码行作为答案本身,只是为了引导我朝着正确的方向前进。

import java.util.Scanner;

public class Cel2Far
{
    public static void main(String[] args) 
    {
        int[] temperature = new int[args.length];

        callAndDisplay(args,temperature);
    } // main


    private static void callAndDisplay(String[] args, int[] temperature)
    {
        getTemps(args,temperature);

        switch(args[0]) {
          case "f":
              System.out.printf("%,d %s converted to Celsius: ",
              (temperature.length-1),(temperature.length-1) > 1 ?    
              "temperatures" : "temperature");

              for (int i = 1; i < temperature.length; i++) {                                                                 
                  System.out.printf("%,.1f ", celsius(temperature[i]) );
              }
              break;

           case "c":
               System.out.printf("%,d %s converted to Fahrenheit: ",
               (temperature.length-1),(temperature.length-1) > 1 ?    
               "temperatures" : "temperature");

               for (int i = 1; i < temperature.length; i++) {
                   System.out.printf("%,.1f ", fahrenheit(temperature[i]) );
               }
               break;

         }
         System.out.println();
    }

    private static boolean getTemps(String[] args, int[] temperature)
    {
        boolean message = false;

        if (! (args[0].equals("c") || args[0].equals("f")) ) {
            message =  false;
        } else {
            for (int i = 0; i < args.length; i++) {
                temperature[i] = Integer.parseInt(args[i]);
                message = true;
            }
        }

        return message;
    }

    private static double celsius(int f)
    {

        double c = 5.0 / 9.0 * (f - 32.0);

        return c;
    }

    private static double fahrenheit(int c)
    {
        double f = 9.0/5.0 * c + 32.0;
        return f;
    }
} // class

标签: javaarrays

解决方案


你似乎把事情复杂化了。在您当前的示例中给出了 2 个输入(第一个是格式c/ f,第二个是实际值),您可以使用以下函数:

private static double convert(String format, double temperature){
    switch(format){
        case "f":
            return toCelsius(temperature);

        case "c":
            return toFahrenheit(temperature);
        default:
            throw new UnsupportedOperationException();
    }
}

private static double toCelsius(double f){
    return 5. / 9. * (f - 32.);
}

private static double toFahrenheit(double c){
    return 9./5. * c + 32.;
}

然后从您的主要方法轻松调用它:

public static void main(String[] args){
    System.out.println(convert(args[0], Double.parseDouble(args[1]));
}

如果您想一次支持多个输入,这也可以很容易地扩大。具有 1 种格式和多种温度 ( f 20 53 63 74):

public static void main(String[] args){
    String format = args[0];
    for(int i = 1; i < args.length; i++){
        System.out.println(convert(args[0], Double.parseDouble(args[i]));
    }
}

或使用交替转换 ( c 56 f 734 f 547 c 598):

public static void main(String[] args){
    for(int i = 0; i < args.length; i++){
        System.out.println(convert(args[i], Double.parseDouble(args[i+1]));
    }
}

当然,在所有这些解决方案中,您必须确保将输入参数提供给程序。args例如,通过检查数组的长度。


推荐阅读