Iterable strings -- strings that you can access in an enhanced 'for' loop (a.k.a. for-each loop).
/**
A string that can be iterated character by character
**/
import java.util.Iterator;
import java.util.NoSuchElementException;
public class IterableString implements Iterable<Character> {
private String thestring;
/**
* Creates a new IterableString
* @param string -- the string data
**/
public IterableString(String string) {
thestring = string;
}
/**
* Returns an iterator for the string that iterates
* character by character
**/
public Iterator<Character> iterator() {
return new StringIterator();
}
// the iterator is a private inner class
private class StringIterator implements Iterator<Character> {
private int position = 0;
/**
* @return - true if there are more characters in the string,
* false otherwise
**/
public boolean hasNext() {
return position < thestring.length();
}
/**
* @return - the next charcaters in the string
* @throws NoSuchElementException when past the last character
**/
public Character next() {
if (position < thestring.length()) {
Character current = thestring.charAt(position);
++position;
return current;
} else {
throw new NoSuchElementException();
}
}
/**
* method not supported
**/
public void remove() {
throw new UnsupportedOperationException();
}
}
}
Testing class for Iterable strings and the next example (iterable Fibonacci numbers).
import java.util.Iterator;
public class TestIterable {
public static void main(String [] args) {
IterableString testString1 = new IterableString("Hi there!");
System.out.println("Printing a string \"Hi there!\" in a for-each loop");
for (char c: testString1) {
System.out.println(c);
}
IterableString testString2 = new IterableString("");
System.out.println("Printing an empty string in a for-each loop");
for (char c: testString2) {
System.out.println(c);
}
IterableString testString3 = new IterableString("Hello");
System.out.println("Printing a string \"Hello\" in an iterator loop");
// behind-the-scenes of a for-each loop
Iterator<Character> iter = testString3.iterator();
while (iter.hasNext()) {
char c = iter.next();
System.out.println(c);
}
// an iterator that produces up to n-th fibonacci numbers (start at 0)
IterableFibonacci fibNumbers = new IterableFibonacci(15);
System.out.println("Fibonacci numbers up to n = 15");
for (int fib: fibNumbers) {
System.out.println(fib);
}
System.out.println("Fibonacci numbers up to n = 10");
fibNumbers.setMaxIndex(10);
for (int fib: fibNumbers) {
System.out.println(fib);
}
}
}
Starting code for IterableFibonacci:
/**
The class implements Iterable Fibonacci numbers, i.e.
Fibonacci numbers that can be produced in a for-each
(enhanced for) loop.
Fibonacci numbers are a sequence of numbers defined as
follows:
F(0) = 0, F(1) = 1, F(k) = F(k-1) + F(k -2) for k > 1.
For more on Fibonacci numbers see
http://en.wikipedia.org/wiki/Fibonacci_number
The parameter maxIndex in the constructor sets the
last index in teh sequence. It can be reset using
setMaxIndex method.
**/
import java.util.Iterator;
import java.util.NoSuchElementException;
public class IterableFibonacci implements Iterable<Integer> {
private int maxIndex;
/**
* Creates a new IterableFibonacci
* @param maxIndex -- the index of the last Fibonacci number returned
* in this sequence
* @throws IllegalArgumentException if maxIndex < 0
**/
public IterableFibonacci(int maxIndex) {
if (maxIndex < 0) {
throw new IllegalArgumentException("Invalid index for Fibonacci" +
"sequence: " + maxIndex);
}
this.maxIndex = maxIndex;
}
/**
* sets the maximal index in this Fibonacci sequence
* @param newMax -- the new value of the maximum index
* in this sequence
* @throws IllegalArgumentException if newMax < 0
**/
public void setMaxIndex(int newMax) {
if (newMax < 0) {
throw new IllegalArgumentException("Invalid index for Fibonacci" +
"sequence: " + newMax);
}
maxIndex = newMax;
}
/**
* Returns an iterator that produces the sequence of Fibonacci
* numbers from index 0 to the maximum index (inclusive)
**/
public Iterator<Integer> iterator() {
return new FibonacciIterator();
}
private class FibonacciIterator implements Iterator<Integer> {
// two latest fibonacci numbers:
private int fib1 = 0;
private int fib2 = 1;
/**
* @return - true if there are more elements in the sequence,
* false otherwise
**/
public boolean hasNext() {
return false; // this is just a stub, replace with your code
}
/**
* @return - the next Fibonacci number in the sequence
* @throws -- FILL THIS IN
**/
public Integer next() {
return 0; // this is just a stub, replace with your code
}
/**
* method not supported
**/
public void remove() {
throw new UnsupportedOperationException();
}
}
}