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

时间:2019-03-11 04:57:47

标签: java arrays

如何将字符串的命令行参数传递给java主方法,该方法将在另一个类中调用特定方法?

我需要能够传递'java Statdriver mean'将调用mean方法,或者'java Statdriver std'将调用标准偏差方法,或者不传递任何参数将导致通过终端调用mean方法。

以我的方式执行操作似乎无效。我相信我的问题在于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 个答案:

答案 0 :(得分:1)

您正在覆盖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);
      }

   }  

}

答案 1 :(得分:0)

如何使用interface并在其中具有与Stat类的方法相同的重写签名的方法:

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方法中,您可以使用Map来保存Stats类的方法引用(假设您使用的是 Java-8 strong>):

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
 }

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

答案 2 :(得分:0)

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

java Statdriver mean

…您的main方法将被赋予一个长度为1的args数组,其中包含"mean"作为元素。

如果执行此操作:

java Statdriver std

…您的main方法将被赋予一个长度为1的args数组,其中包含"std"作为元素。

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

正如Andronicus所指出的那样,您正在尝试为args分配值,您不应该这样做。实际上,您根本不需要更改args

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

  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”,则计算标准差”。

答案 3 :(得分:-2)

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;

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

      while(input.hasNextDouble())
      {
         data.add(input.nextDouble());
      }

      if(args[0].equals("mean"))
      {
         mean = Stats.mean(data);
         System.out.println("Mean: " + mean);
      }

      else if(args[1].equals("std"))
      {
         standardDeviation = Stats.stdDev(data);
         System.out.println("StdDev: " + standardDeviation);
      }

      else
      {
         mean = Stats.mean(data);
         System.out.println("Mean: " + mean);
      }

   }  

}