I have exercise: define an Incrementer class to get the code from main class gave the result:
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 + " "); } } }
gave the result:
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
Requirement: the program (including the Incrementer class) cannot use tables or collections.
Hints:
in (…) and by (…) are methods in the Incrementer class Incrementer should implement the Iterable interface
MY QUESTION IS: How to iteratre throught method when in main Test class is no define Incrementer?! –> for(int k : in(1, 10)) System.out.print(k + " ");
Advertisement
Answer
I think you should be able to achieve this using a customized Iterable<Integer>
class like shown below. Basically I’ve added these things in Incrementer
:
Incrementer
has a static methodin()
which will receive two integers for range start and end and returns and instance ofIterator
.- In
iterator()
method, we will be returning anInterator<Integer>
which would simply addstep
value tocurrent
value and return. hasNext()
would make sure that next incoming value stays within range bounds.Incrementer
would also have aby()
method which would allow modification of it’s member variablestep
. Values ofstart
andend
would change depending onstep
is positive or negative
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; } }; } }
I tested it using the code you provided and was able to see desired output.