我的代码所基于的问题可在以下网站找到:
基本上,我的代码适用于布尔值,但对于以下方法: percentFiltered ,我的代码变得狂暴。
通过上面提供的链接提交我的代码时, 我的输出 是:
percentFiltered(initial):0.0
process(0)进程返回值:true percentFiltered:100.0
super.process名为:false进程(0)进程返回值:true percentFiltered:200.0
但是,这是 正确 输出 :
percentFiltered(initial):0.0
process(0)进程返回值:true percentFiltered:100.0
super.process名为:falseprocess(0)进程返回值:true percentFiltered:100.0
请注意,我的预期答案是100.0(我得到200.0,他们得到100.0)。所以现在我很难过。我对这个继承的东西还很新,所以我不知道我哪里出错了。这是我编写和提交的代码:
public class FilteredAccount extends Account {
private int nonzeroTransCnt = 1;
private int zeroTransCnt;
public FilteredAccount(Client c) {
super(c);
}
public double percentFiltered() {
return zeroTransCnt / nonzeroTransCnt * 100.0;
}
public boolean process(Transaction t) {
if (t.value() == 0) {
zeroTransCnt++;
super.__processCalled = false;
return true;
}
else {
nonzeroTransCnt++;
super.__processCalled = true;
return t.value() > -100 && t.value() < 1000000;
}
}
}
如果您点击上面的链接,他们会有一个名为帐户的扩展文件。 如果你能帮助我,请提前致谢。
答案 0 :(得分:1)
问题是您的公式不正确。您需要除以交易总数,而不是未过滤交易的数量。你还遇到了一个问题,你在进行双击之前你正在进行int分裂。
public double percentFiltered() {
return (100.0 * zeroTransCnt) / (nonzeroTransCnt + zeroTransCnt);
}
另一方面,您可以使用super来简化流程。你可能不应该直接设置旗帜。
public boolean process(Transaction t) {
if (t.value() == 0) {
zeroTransCnt++;
return true;
}
else {
nonzeroTransCnt++;
return super.process(t);
}
}
编辑:
另一个问题是你最初将nonzeroTransCnt设置为1。虽然它确实阻止了初始调用的零误差,但它会得到不正确的结果。
private int nonzeroTransCnt;
您可能希望为初始调用添加单独的检查。
public double percentFiltered() {
if ((nonzeroTransCnt + zeroTransCnt) == 0) {return 0.0;} //for initial call
return (100.0 * zeroTransCnt) / (nonzeroTransCnt + zeroTransCnt);
}