4 回答

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個(gè)贊
您正在覆蓋變量。這應(yīng)該是這樣的: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貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個(gè)贊
如何使用 一個(gè),并在其中有一個(gè)方法,該方法具有與類的方法相同的覆蓋簽名: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
}
}
現(xiàn)在,在 main 方法中,您可以使用 a 來保存類的方法引用(假設(shè)您使用的是 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
}
因此,根據(jù)您在數(shù)組中傳遞的值,我們將通過從 中獲取實(shí)現(xiàn)來調(diào)用該操作。這采用運(yùn)行時(shí)多態(tài)性來決定在運(yùn)行時(shí)調(diào)用哪個(gè)方法。argsMap

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊
當(dāng)使用Java反射功能時(shí),解決方案很簡(jiǎn)單。這是代碼
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貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊
命令行參數(shù)是在命令行上的“java classname”之后指定的單詞。因此,如果您執(zhí)行以下命令:
java Statdriver mean
...您的方法將被賦予一個(gè)長(zhǎng)度為一的數(shù)組,包含為元素。mainargs"mean"
如果執(zhí)行此命令:
java Statdriver std
...您的方法將被賦予一個(gè)長(zhǎng)度為一的數(shù)組,包含為元素。mainargs"std"
在所有這些情況下,長(zhǎng)度為一。您應(yīng)該只檢查 。沒有 ,嘗試訪問它將引發(fā)異常。argsargs[0]args[1]
正如Andronicus所指出的,您正在嘗試為 分配值,而您不應(yīng)該這樣做。事實(shí)上,你根本不需要改變。argsargs
只需檢查是否等于每個(gè)有意義的字符串值: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);
}
它有助于考慮您實(shí)際要檢查的內(nèi)容。好的代碼讀起來像自然思維或說話:“如果第一個(gè)參數(shù)是”均值“,則計(jì)算均值,否則如果第一個(gè)參數(shù)是”std“,則計(jì)算標(biāo)準(zhǔn)差”等等。
添加回答
舉報(bào)