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?
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?
Respostas:
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 concluir for (char c : str.toCharArray()) { }
é de ~ 250ms e o tempo necessário para concluir for (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 geral for
-loop, que avalia a condição de paragem-cada iteração.)
String s = "xyz";
for(int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
}
Outra solução útil, você pode trabalhar com essa string como matriz de String
for (String s : "xyz".split("")) {
System.out.println(s);
}
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:
String str = "xyz";
char arr[] = str.toCharArray(); // convert the String object to array of char
// iterate over the array using the for-each loop.
for(char c: arr){
System.out.println(c);
}
No Java 8 , podemos resolvê-lo da seguinte maneira:
String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));
O método chars () retorna um IntStream
como mencionado no doc :
Retorna um fluxo de int estendendo zero os valores de caracteres dessa sequência. Qualquer caractere mapeado para um ponto de código substituto é passado não interpretado. Se a sequência for alterada enquanto o fluxo estiver sendo lido, o resultado será indefinido.
forEachOrdered
e não forEach
?O comportamento de forEach
é explicitamente não determinístico, onde, quando ele forEachOrdered
executa uma ação para cada elemento desse fluxo, na ordem de encontro do fluxo, se o fluxo tiver uma ordem de encontro definida. Portanto forEach
, 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.
Infelizmente o Java não faz String
implementar Iterable<Character>
. Isso poderia ser feito facilmente. Existe, StringCharacterIterator
mas isso nem sequer implementa Iterator
... Então faça o seu:
public class CharSequenceCharacterIterable implements Iterable<Character> {
private CharSequence cs;
public CharSequenceCharacterIterable(CharSequence cs) {
this.cs = cs;
}
@Override
public Iterator<Character> iterator() {
return new Iterator<Character>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < cs.length();
}
@Override
public Character next() {
return cs.charAt(index++);
}
};
}
}
Agora você pode (um pouco) facilmente executar for (char c : new CharSequenceCharacterIterable("xyz"))
...
Se você usa o Java 8, pode usar chars()
no String
para obter um número Stream
de caracteres, mas precisará int
retroceder para a char
como chars()
retorna um IntStream
.
"xyz".chars().forEach(i -> System.out.print((char)i));
Se você usar Java 8 com Eclipse Collections , poderá usar o método de CharAdapter
classe forEach
com uma referência lambda ou method para iterar sobre todos os caracteres em a String
.
Strings.asChars("xyz").forEach(c -> System.out.print(c));
Este exemplo específico também pode usar uma referência de método.
Strings.asChars("xyz").forEach(System.out::print)
Nota: Sou um colaborador das Coleções Eclipse.
Você também pode usar um lambda neste caso.
String s = "xyz";
IntStream.range(0, s.length()).forEach(i -> {
char c = s.charAt(i);
});
Para Travers uma String, você também pode usar charAt()
com a string.
gostar :
String str = "xyz"; // given String
char st = str.charAt(0); // for example we take 0 index element
System.out.println(st); // print the char at 0 index
charAt()
é um método de manipulação de string em java que ajuda a rastrear a string para caracteres específicos.
for (char st: "xyz".toCharArray()) {}
é?