当前位置: 首页 > 知识库问答 >
问题:

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

熊朝
2023-03-14

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

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

按我的方式做似乎不起作用。我认为我的问题在于如果,否则如果,否则循环。

这是我的密码:

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);



   }  

}

共有3个答案

仲孙景胜
2023-03-14

使用接口并在其中包含与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):

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中获取实现来调用该操作。这使用运行时多态性来决定在运行时调用哪个方法。

焦驰
2023-03-14

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

java Statdriver mean

…您的main方法将获得长度为1的args数组,其中包含作为元素的“平均值”

如果执行此操作:

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);
  }

这有助于思考您真正想要检查的内容。好的代码读起来像自然思维或说话:“如果第一个参数是“平均值”,那么计算平均值,否则如果第一个参数是“标准差”,那么计算标准偏差”等等。

司马辉
2023-03-14

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

   }  

}
 类似资料:
  • 要启动Java程序,我可以传递如下参数: 在gradle命令行中有哪些好的方法可以做到这一点: 这是正在建造的。格雷德尔:

  • 如果你需要在命令行下插入一个值,通常需要使用引号将其括起来,尤其是当其包含空格时更是如此。 shellquote 函数可以携带任意数量的参数(包括数组), 它会使用引号将每个参数都括起来并返回一个可以传递到 Shell 命令行上的以空格间隔的字符串。 在下面的例子中,我们想要创建一个用于文件改名的 exec 资源, 然而源文件名和目标文件名都包含空格,因此在命令行上需要正确地使用引号将它们括起来。

  • 问题内容: 是否可以通过命令行将参数传递给MySQL脚本? 在此示例中,类似于@start_date的内容: 问题答案: 发现在网络上的答案在这里。 基本上,假设我们要运行以下查询: 我们可以这样传递“ start_date”和“ end_date”:

  • public static void main(String[]args){ 公共类CustomConfiguration{ public static void readConfig(String filename){//从config.properties文件读取 } 我的问题是如何将“a”传递给CustomConfiguration类?

  • 问题内容: 我从Eclipse项目构建了可运行的JAR,该项目处理给定的XML文件并提取纯文本。但是,此版本要求文件在代码中进行硬编码。 有没有办法做这样的事情 并让jar在xml文件上执行? 我已经四处查看,给出的所有示例都与在命令行上编译JAR有关,而没有一个处理传入参数。 问题答案: 为什么不 ? 只需修改您的参数即可接收论据并对其进行操作。 在命令行中指定完整路径。

  • 我使用atom-run(https://github.com/lsegal/atom-runner)运行内联我的nodejs程序。 使用此插件时,是否可以传递命令行参数?点击Alt R启动节点,但由于我的脚本需要参数,它失败了。 在运行之前,如何传递命令行参数?