我必须通过myobject进行的练习有问题

gv8xihay  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(253)

我有一个练习:定义一个incrementer类,从主类获取代码并给出结果:

package incr;
import static incr.Incrementer.*;

    public class Test {

  public static void main(String[] args) {

    // simplest iteration - step = 1
    for(int k : in(1, 10)) System.out.print(k + " ");
    System.out.println();

    // The given step
    for(int k : in(1, 10).by(2)) System.out.print(k + " ");
    System.out.println();

    // It can be the other way around - step = -1 by default
    for(int k : in(10, 1)) System.out.print(k + " ");
    System.out.println();

    // But the range can be made from min to max and the given step will be
    // decide on the iteration direction
    for(int k : in(1, 10).by(-1)) System.out.print(k + " ");
    System.out.println();

    // During the iteration, you can change the step
    Incrementer inc;
    for (int i : inc = in(1,10) ) {
      if (i == 4) inc.by(2);
      System.out.print(i + " ");
    }
    System.out.println();
    for (int i : inc = in(1,10) ) {
      if (i == 8) inc.by(-2);
      System.out.print(i + " ");
    }
    System.out.println();
    for(int k : inc = in(10, 1)) {
      if (k == 5) inc.by(1);
      System.out.print(k + " ");
    }

  }

}

给出了结果:

1 2 3 4 5 6 7 8 9 10 
1 3 5 7 9 
10 9 8 7 6 5 4 3 2 1 
10 9 8 7 6 5 4 3 2 1 
1 2 3 4 6 8 10 
1 2 3 4 5 6 7 8 6 4 2 
10 9 8 7 6 5 6 7 8 9 10

要求:程序(包括incrementer类)不能使用表或集合。
提示:
in(…)和by(…)是incrementer类中的方法incrementer应该实现iterable接口
我的问题是:当主测试类中没有define incrementer时,如何遍历方法?!--> for(int k : in(1, 10)) System.out.print(k + " ");

wfauudbj

wfauudbj1#

我想你应该可以通过定制的 Iterable<Integer> 如下图所示。基本上我把这些东西加进去了 Incrementer : Incrementer 有一个静态方法 in() 它将接收范围开始和结束的两个整数,并返回 Iterator .
iterator() 方法,我们将返回一个 Interator<Integer> 这只会增加 step 价值 current 价值与回报。 hasNext() 将确保下一个传入值保持在范围界限内。 Incrementer 也会有一个 by() 允许修改其成员变量的方法 step . 价值观 start 以及 end 将根据 step 是积极的还是消极的

import java.util.Iterator;
import java.util.NoSuchElementException;

public class Incrementer implements Iterable<Integer> {
    private Integer current;
    private Integer step;
    private Integer start;
    private Integer end;

    public Incrementer(Integer start, Integer end) {
        this.start = start;
        this.end = end;
        this.step = start > end ? -1 : 1;
        this.current = null;
    }

    public Incrementer by(Integer offset) {
        this.step = offset;
        if ((offset < 0 && this.start < this.end) ||
                (offset > 0 && this.start > this.end)) {
            swapStartAndEnd();
        }
        return this;
    }

    private void swapStartAndEnd() {
        Integer temp = this.start;
        this.start = this.end;
        this.end = temp;
    }

    public static Incrementer in(Integer start, Integer end) {
        return new Incrementer(start, end);
    }

    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            @Override
            public boolean hasNext() {
                if (current == null) {
                    return true;
                }
                return isNextValueWithinBounds(getNextValue(current));
            }

            @Override
            public Integer next() {
                if (!hasNext()) throw new NoSuchElementException();
                if (current == null) {
                    current = start;
                } else {
                    current = getNextValue(current);
                }

                return current;
            }

            private boolean isNextValueWithinBounds(Integer value) {
                if (start > end) {
                    return value >= end;
                } else {
                    return value <= end;
                }
            }

            private Integer getNextValue(Integer value) {
                return value + step;
            }
        };
    }
}

我使用您提供的代码对其进行了测试,能够看到所需的输出。

相关问题