如何将字符串的命令行参数传递给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);
}
}
答案 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);
}
}
}