我想从一个号码转到另一个号码。例如,如果我从6开始,我的目标是10,我想要一个函数,每次传球都会让我从6变为10,或者如果我的数字是14,我的目标是9,那么它将从14减少到9。我有(这是在处理Java Api中写的,但与regalr Java基本没有区别,draw只是一个连续的循环)
int x=100;
void draw(){
x=towards(x,10);
println(x);
}
int towards(int current ,int target){
if(current!=target){
if (current <target){
current=current+1;
}
else {
current=current-1;
}
}
return current;
}
这给了我想要的结果,但我想把所有东西都放在()函数的一边。当我用变量替换X时,它当然会将其自身重置为静态变量。
总结一下,如何将变量传递给函数,并让每个后续传递的传递变量。我已经将递归视为一种解决方案,但这只是让我得出最终的解决方案。我可以将计数传递给数组,但也不想这样做。
答案 0 :(得分:2)
Java使用pass-by-value,因此您无法更改参数(尽管如果参数是用户定义的对象,您可以更改参数指向的对象,但不能更改参数本身)。
但是,您可能会考虑的一件事是创建一个迭代器类型接口:
// RangeIterator.java public class RangeIterator implements Iterator<Integer> { public RangeIterator(int first, int last){ _first = first; _last = last; if ( _first <= _last ){ _step = 1; }else{ _step = -1; } } public RangeIterator(int first, int last, int step){ if ( step == 0 ){ throw new IllegalArgumentException("Step must be non-zero."); } _first = first; _last = last; _step = step; } public boolean hasNext(){ if ( _step < 0 ){ return _first > _last; } else { return _first < _last; } } public Integer next(){ int result = _first; _first += _step; return result; } public void remove(){ throw new UnsupportedOperationException("Not implemented."); } private int _first; private int _last; private int _step; } // Range.java public class Range implements Iterable<Integer> { public Range(int first, int last){ _first = first; _last = last; if ( _first <= _last ){ _step = 1; }else{ _step = -1; } } public Range(int first, int last, int step){ if ( step == 0 ){ throw new IllegalArgumentException("Step must be non-zero."); } _first = first; _last = last; _step = step; } public Iterator<Integer> iterator(){ return new RangeIterator(_first,_last,_step); } private int _first; private int _last; private int _step; }
使用上面的代码,您可以方便地编写如下内容:
Range range = new Range(x,100); for (int val : range){ println(val); }
由于我发现你来自Python背景,这应该感觉非常像:
for val in xrange(x,100): print val;
您可以实现Iterable和Iterator接口,以便提供可在Java for-each循环中使用的自己的生成器。基本上,for (Type identifier1 : identifier2)
遍历 identifier2 的内容,该内容需要是Iterable类型,并且在每次迭代时将当前元素分配给 identifier1 。循环只是用于迭代 identifier2 .iterator()的语法糖。
答案 1 :(得分:0)
Java 始终按值传递int
个参数。如果你想保持状态(特别是可写状态),那么将它保存在一个对象中,并(可能)使towards()
成为该类的方法。