方法不适用于数组的所有元素

时间:2018-07-17 07:40:46

标签: java arrays

已更新

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

输出应为“将整数转换为摄氏x y 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

3 个答案:

答案 0 :(得分:1)

您似乎使事情复杂化了。在当前示例中,有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数组的长度。

答案 1 :(得分:0)

您的代码中似乎存在一些逻辑错误:

在您的switch语句中,您不是用传递的数字作为参数来调用celsius()fahrenheit()方法,而是循环索引(celsius(i))。

您总是将1、2、3 ...摄氏度转换为华氏度,反之亦然。使用数组getTempstemperature[]解析的输入,然后将正确的项目从该数组传递给转换的celsius()fahrenheit()方法。

您的getTemps方法中的条件也是错误的。您可能打算使用||运算符而不是&&,因为-当然-字符串不能同时等于“ c”和“ f”。

此外,解析整数的循环中的索引不应从0开始,而应从1开始,因为第一项是字符串“ c”或“ f”而不是int!如果尝试将非整数字符串解析为整数,则可能会得到NumberFormatException,并且程序将退出。

答案 2 :(得分:0)

这是您的问题:if (! (args[0].equals("c") && args[0].equals("f")) )

该条件永远不能为真,因为字母不能同时为“ c”和“ f”。应该是||而不是&&

由于这个问题,代码总是进入if块,并且永远不会将整数放入数组temperature中。 Java始终默认将数字变量初始化为0,因此,无论输入什么数字,程序总是将0 F转换为C,反之亦然。