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 charum 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 toCharArraymé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 IntStreamcomo 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.
forEachOrderede não forEach?O comportamento de forEaché explicitamente não determinístico, onde, quando ele forEachOrderedexecuta 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 Stringimplementar Iterable<Character>. Isso poderia ser feito facilmente. Existe, StringCharacterIteratormas 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 Stringpara obter um número Streamde caracteres, mas precisará intretroceder para a charcomo 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 CharAdapterclasse forEachcom 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()) {}é?