J'ai besoin d'un Iterator<Character>
d'un objet String
. Y a-t-il une fonction disponible en Java qui me le fournit ou dois-je coder la mienne?
Réponses
Trop de publicités?Une option est d'utiliser la Goyave:
ImmutableList<Character> chars = Lists.charactersOf(someString);
UnmodifiableListIterator<Character> iter = chars.listIterator();
Cela produit une liste immuable de caractères qui est soutenu par la chaîne (pas de reproduction).
Si vous finissez par faire ce vous-même, cependant, je vous recommande de ne pas s'exposer à la classe d'implémentation de l' Iterator
comme un certain nombre d'autres exemples ne. Je vous recommande plutôt de faire votre propre utilitaire de la classe et de l'exposer statique méthode:
public static Iterator<Character> stringIterator(final String string) {
// Ensure the error is found as soon as possible.
if (string == null)
throw new NullPointerException();
return new Iterator<Character>() {
private int index = 0;
public boolean hasNext() {
return index < string.length();
}
public Character next() {
/*
* Throw NoSuchElementException as defined by the Iterator contract,
* not IndexOutOfBoundsException.
*/
if (!hasNext())
throw new NoSuchElementException();
return string.charAt(index++);
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
Cela n'existe pas, mais c'est trivial à implémenter:
class CharacterIterator implements Iterator<Character> {
private final String str;
private int pos = 0;
public CharacterIterator(String str) {
this.str = str;
}
public boolean hasNext() {
return pos < str.length();
}
public Character next() {
return str.charAt(pos++);
}
public void remove() {
throw new UnsupportedOperationException();
}
}
L'implémentation est probablement aussi efficace que possible.
Voler quelqu'un d'autre dans une autre réponse, c'est probablement la meilleure implémentation directe (si vous n'utilisez pas la goyave).
/**
* @param string
* @return list of characters in the string
*/
public static List<Character> characters(final String string) {
return new AbstractList<Character>() {
@Override
public Character get(int index) {
return string.charAt(index);
}
@Override
public int size() {
return string.length();
}
};
}
CharacterIterator it = new StringCharacterIterator("abcd");
// Iterate over the characters in the forward direction
for (char ch=it.first(); ch != CharacterIterator.DONE; ch=it.next())
// Iterate over the characters in the backward direction
for (char ch=it.last(); ch != CharacterIterator.DONE; ch=it.previous())