34 votes

Java: comment obtenir Iterator <Character> de String

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?

32voto

ColinD Points 48573

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();
    }
  };
}

18voto

aioobe Points 158466

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.

14voto

user1680517 Points 39

for (char c: myString.toCharArray ()) {

}

4voto

Lee Points 81

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();
        }
    };
}
 

2voto

virgium03 Points 677
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()) 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X