对于两个变量的调用,@x4u 是正确的。三变量调用会比较难模拟。
例如,我认为 linspace(1,30,60) 应该产生值 1, 1.5, 2, 2.5, 3, 3.5...,或者这可能是 linspace(1,30,59) 的值- - 无论如何,同样的问题。
使用这种格式,您必须自己进行计算——我个人会创建一个新对象来为我完成所有工作,而忘记 for 循环。
counter=new Linspace(1,30,60);
while(counter.hasNext()) {
process(counter.getNextFloat())
}
或者干脆
while(float f : new Linspace(1,30,60)) {
process(f);
}
如果你有你的 Linspace 对象实现 Iterable。
那么计数器对象的内部应该很容易实现,它会很容易地与你交流它正在做什么,而不会用一堆数字计算来混淆你的代码来计算比率。
实现可能是这样的:
(注意:未经测试,我很确定这很容易受到边缘情况和浮点错误的影响!它也可能无法处理 end
public class Linspace {
private float current;
private final float end;
private final float step;
public Linspace(float start, float end, float totalCount) {
this.current=start;
this.end=end;
this.step=(end - start) / totalCount;
}
public boolean hasNext() {
return current < (end + step/2); //MAY stop floating point error
}
public float getNextFloat() {
current+=step;
return current;
}
}