代码之家  ›  专栏  ›  技术社区  ›  Tegra Detra

功能改变输入

  •  1
  • Tegra Detra  · 技术社区  · 15 年前

    我想从一个号码转到另一个号码。举例来说,如果我在6开始,我的目标是10,我想要一个函数,每一道次都会把我从6变成10,或者如果我有数字14,我的目标是9,它会从14下降到9。M ReGualr 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;
    }
    

    这给了我我想要的结果,但是我想把所有东西都放在toward()函数的一边。当我用一个变量替换x时,它当然会将自己重置为静态变量。

    总结一下,我如何将变量传递给函数,并使传递的变量在随后的每次传递中都发生变化。我把递归作为一个解决方案来研究,但它只会给我带来一个最终的解决方案。我可以将计数传递给数组,但我也不想这样做。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Michael Aaron Safyan    15 年前

    Java使用传递值,因此不能更改参数(虽然参数是用户定义的对象,但可以更改由参数指向的对象,而不是参数本身)。

    不过,您可以考虑的一件事是创建迭代器类型接口:

    // 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 ( Type identifier1 : identifier2 ) 遍历的内容 标识2 它需要是iterable类型,并且在每次迭代时将当前元素分配给 标识1 . 循环只是循环的语法糖 标识2 迭代器()。

        2
  •  0
  •   Donal Fellows    15 年前

    爪哇 总是 传球 int 按值列出的参数。如果您想保持状态(特别是可写状态),那么将其保存在一个对象中,并(可能)使 towards() 类的方法。

    推荐文章