为了账号安全,请及时绑定邮箱和手机立即绑定

传递给调用方法的命令行参数

传递给调用方法的命令行参数

慕姐4208626 2022-08-03 10:22:15
如何将字符串的命令行参数传递给 java main 方法,该方法将调用另一个类中的特定方法?我需要能够传递'java Statdriver均值'将调用均值方法,或者'java Statdriver std'将调用标准差方法,或者不传递任何参数将导致通过终端调用均值方法。按照我的方式去做似乎行不通。我相信我的问题在于if,else if,else循环。这是我的代码:public class StatDriver{   public static void main(String[] args)   {      Scanner input = new Scanner(System.in);      double total;      double mean;      double standardDeviation;      double average;      total = 0;      args[0] = "mean";      args[1] = "std";      ArrayList<Double> data = new ArrayList<Double>();      while(input.hasNextDouble())      {         data.add(input.nextDouble());      }      if(args.equals(args[0]))      {         mean = Stats.mean(data);         System.out.println("Mean: " + mean);      }      else if(args.equals(args[1]))      {         standardDeviation = Stats.stdDev(data);         System.out.println("StdDev: " + standardDeviation);      }      else      {         mean = Stats.mean(data);         System.out.println("Mean: " + mean);      }     // mean = Stats.mean(data);    //standardDeviation = Stats.stdDev(data);    //System.out.println("Mean: " + mean);    // System.out.println(" StdDev: " + standardDeviation);   }  }
查看完整描述

4 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

您正在覆盖变量。这应该是这样的:args


public class StatDriver

{


   public static void main(String[] args)

   {

      Scanner input = new Scanner(System.in);


      double total;

      double mean;

      double standardDeviation;

      double average;



      total = 0;


      String[] possibleArgs = new String[2];

      possibleArgs[0] = "mean";

      possibleArgs[1] = "std";


      ArrayList<Double> data = new ArrayList<Double>();


      while(input.hasNextDouble())

      {

         data.add(input.nextDouble());

      }


      if(possibleArgs[0].equals(args[0]))

      {

         mean = Stats.mean(data);

         System.out.println("Mean: " + mean);

      }


      else if(possibleArgs[1].equals(args[1]))

      {

         standardDeviation = Stats.stdDev(data);

         System.out.println("StdDev: " + standardDeviation);

      }


      else

      {

         mean = Stats.mean(data);

         System.out.println("Mean: " + mean);

      }


   }  


}


查看完整回答
反对 回复 2022-08-03
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

如何使用 一个,并在其中有一个方法,该方法具有与类的方法相同的覆盖签名:interfaceStat


interface StatsOperation{

       double compute(List<Double> data);

}

虽然类将如下所示:Stat


class Stats{

        public static double mean(List<Double> data){

            System.out.println("mean invoked");

            //compute mean 

        }

        public static double stdDev(List<Double> data){

            System.out.println("stddev invoked");

           //compute std dev

        }

 }

现在,在 main 方法中,您可以使用 a 来保存类的方法引用(假设您使用的是 Java-8):MapStats


public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        Map<String, StatsOperation> lookup = new HashMap<>();

        lookup.put("mean", Stats::mean); //"mean" corresponds to Stats::mean implementation

        lookup.put("stddev", Stats::stdDev); //"stddev" corresponds to Stats::mean implementation

        ArrayList<Double> data = new ArrayList<Double>();

        while(input.hasNextDouble())

        {

            data.add(input.nextDouble());

            if(data.size() == 5) break; //breaking after 5 elements

        }

        StatsOperation operation = args.length > 0 && lookup.get(args[0]) != null ? lookup.get(args[0]) : lookup.get("mean"); //by default calling mean if nothing is sent in args array

        double result = operation.compute(data);

        System.out.println("Output " + result);

        // other business logic below

 }

因此,根据您在数组中传递的值,我们将通过从 中获取实现来调用该操作。这采用运行时多态性来决定在运行时调用哪个方法。argsMap


查看完整回答
反对 回复 2022-08-03
?
青春有我

TA贡献1784条经验 获得超8个赞

当使用Java反射功能时,解决方案很简单。这是代码


    import java.lang.reflect.Method;

    import java.util.ArrayList;

    import java.util.Scanner;


    public class StatDriver {


        public static void main(String[] args)

        {

            Scanner input = new Scanner(System.in);

            ArrayList<Double> data = new ArrayList<Double>();


            while(input.hasNextDouble()) {

                data.add(input.nextDouble());

            }


            int length = args.length;


            if(length == 0) {

                double mean = Stats.mean(data);  // By default , mean method is called

        System.out.println(" Result (Mean) :"+mean);

    }

    else if(length > 0) {

        String methodName = args[0];


        try {

            Method method = Stats.class.getMethod(methodName, ArrayList.class);

            method.setAccessible(true);

            Object result = method.invoke(null , data);

            System.out.println("Result of the method :"+methodName+" is "+result);

                }

                catch(Exception e) {

                    e.printStackTrace();

                }

            }

        }

    }


    class Stats{


        public static double mean(ArrayList aList) {

            double result = 0.0D;

            //Logic here

            return result;

        }


        public static double stdDev(ArrayList aList) {

            double result = 0.0D;

            //Logic here

            return result;

        }

    }


查看完整回答
反对 回复 2022-08-03
?
慕的地10843

TA贡献1785条经验 获得超8个赞

命令行参数是在命令行上的“java classname”之后指定的单词。因此,如果您执行以下命令:


java Statdriver mean

...您的方法将被赋予一个长度为一的数组,包含为元素。mainargs"mean"


如果执行此命令:


java Statdriver std

...您的方法将被赋予一个长度为一的数组,包含为元素。mainargs"std"


在所有这些情况下,长度为一。您应该只检查 。没有 ,尝试访问它将引发异常。argsargs[0]args[1]


正如Andronicus所指出的,您正在尝试为 分配值,而您不应该这样做。事实上,你根本不需要改变。argsargs


只需检查是否等于每个有意义的字符串值:args[0]


  if (args[0].equals("mean"))

  {

     mean = Stats.mean(data);

     System.out.println("Mean: " + mean);

  }


  else if (args[0].equals("std"))

  {

     standardDeviation = Stats.stdDev(data);

     System.out.println("StdDev: " + standardDeviation);

  }


  else

  {

     mean = Stats.mean(data);

     System.out.println("Mean: " + mean);

  }

它有助于考虑您实际要检查的内容。好的代码读起来像自然思维或说话:“如果第一个参数是”均值“,则计算均值,否则如果第一个参数是”std“,则计算标准差”等等。


查看完整回答
反对 回复 2022-08-03
  • 4 回答
  • 0 关注
  • 81 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信