Re: Iterating over a String
Roedy Green wrote:
It has bugged me that the for:each syntax would not let me write code
of the form:
String categories = "amq";
...
for ( char category: categories )
However, you can write this:
String categories = "amq";
...
final char[] cats = categories.toCharArray();
for ( char category : cats )
What is your opinion. Would you prefer it, or a indexing look with
CharAt?
The indexing loop lets you look back and forward, which the for:each
does not.
Here's a utility class that makes it easy to apply the for each loop to
a String, if that is what you want to do. I use the for loop whenever it
works without stretching. See the main method at the end for an example
of using the class.
import java.util.Iterator;
import java.util.NoSuchElementException;
public class IterableString implements Iterable<Character> {
private String data;
/**
* Create an Iterable for the specified String
*
* @param data
* The String to iterate.
*/
public IterableString(String data) {
super();
this.data = data;
}
@Override
public Iterator<Character> iterator() {
return new StringIterator(data);
}
private static class StringIterator implements Iterator<Character> {
private String data;
private int index = 0;
public StringIterator(String data) {
this.data = data;
}
@Override
public boolean hasNext() {
return index < data.length();
}
@Override
public Character next() {
if (index < data.length()) {
Character result = data.charAt(index);
index++;
return result;
} else {
throw new NoSuchElementException();
}
}
@Override
public void remove() {
throw new UnsupportedOperationException("No remove from String");
}
}
/** Demonstration method */
public static void main(String[] args) {
String testData = "xyzzy";
for(char c : new IterableString(testData)){
System.out.println(c);
}
}
}