Então, eu quero iterar para cada caractere em uma string.
Então eu pensei:
for (char c : "xyz")
mas recebo um erro do compilador:
MyClass.java:20: foreach not applicable to expression type
Como posso fazer isso?
A maneira mais fácil de cada um de cada char
um String
é usar toCharArray()
:
for (char ch: "xyz".toCharArray()) {
}
Isso fornece a concisão de cada construção, mas infelizmente String
(que é imutável) deve executar uma cópia defensiva para gerar a char[]
(que é mutável), para que haja alguma penalidade de custo.
A partir da documentação :
[
toCharArray()
retorna] uma matriz de caracteres recém-alocada cujo comprimento é o comprimento dessa sequência e cujo conteúdo é inicializado para conter a sequência de caracteres representada por essa sequência.
Existem maneiras mais detalhadas de iterar os caracteres em uma matriz (regular para loop CharacterIterator
, etc.), mas se você estiver disposto a pagar o custo toCharArray()
de cada uma delas, é a mais concisa.
toCharArray( )
é chamado 3 vezes?211900000
, o tempo necessário para concluirfor (char c : str.toCharArray()) { }
é de ~ 250ms e o tempo necessário para concluirfor (char c : charArray) { }
é <10ms. Obviamente, esses valores de tempo dependerão do hardware, mas a conclusão é que um método é significativamente caro que o outro.toCharArray()
não está dentro do corpo do loop; é chamado apenas uma vez e, em seguida, o loop itera sobre a matriz resultante. (A-para cada circuito é diferente do que a geralfor
-loop, que avalia a condição de paragem-cada iteração.)fonte
Outra solução útil, você pode trabalhar com essa string como matriz de String
fonte
split()
mapeado para mais de um caractere Java, o que é o caso de quase todos os emoticons. Por exemplo, essa variação do seu exemplo seráfor (String s : "x😁z".split("")) { System.out.println(s); }
Você precisa converter o objeto String em uma matriz de caracteres usando o
toCharArray
método () da classe String:fonte
No Java 8 , podemos resolvê-lo da seguinte maneira:
O método chars () retorna um
IntStream
como mencionado no doc :Por que usar
forEachOrdered
e nãoforEach
?O comportamento de
forEach
é explicitamente não determinístico, onde, quando eleforEachOrdered
executa uma ação para cada elemento desse fluxo, na ordem de encontro do fluxo, se o fluxo tiver uma ordem de encontro definida. PortantoforEach
, não garante que o pedido seja mantido. Verifique também esta pergunta para mais informações.Também poderíamos usar
codePoints()
para imprimir; consulte esta resposta para obter mais detalhes.fonte
Infelizmente o Java não faz
String
implementarIterable<Character>
. Isso poderia ser feito facilmente. Existe,StringCharacterIterator
mas isso nem sequer implementaIterator
... Então faça o seu:Agora você pode (um pouco) facilmente executar
for (char c : new CharSequenceCharacterIterable("xyz"))
...fonte
Se você usa o Java 8, pode usar
chars()
noString
para obter um númeroStream
de caracteres, mas precisaráint
retroceder para achar
comochars()
retorna umIntStream
.Se você usar Java 8 com Eclipse Collections , poderá usar o método de
CharAdapter
classeforEach
com uma referência lambda ou method para iterar sobre todos os caracteres em aString
.Este exemplo específico também pode usar uma referência de método.
Nota: Sou um colaborador das Coleções Eclipse.
fonte
Você também pode usar um lambda neste caso.
fonte
Para Travers uma String, você também pode usar
charAt()
com a string.gostar :
charAt()
é um método de manipulação de string em java que ajuda a rastrear a string para caracteres específicos.fonte
for (char st: "xyz".toCharArray()) {}
é?