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);
}
}
}
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
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;
}
}
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“,则计算标准差”等等。
添加回答
举报