[Java] Come posso applicare il ciclo for-each a ogni carattere in una stringa?


Answers

Il modo più semplice per-ogni char in una String è usare toCharArray() :

for (char ch: "xyz".toCharArray()) {
}

Questo ti dà la concisione di per ogni costrutto, ma sfortunatamente String (che è immutabile) deve eseguire una copia difensiva per generare il char[] (che è mutabile), quindi c'è una penalità di costo.

Dalla documentation :

[ toCharArray() restituisce] una matrice di caratteri appena allocata la cui lunghezza è la lunghezza di questa stringa e il cui contenuto è inizializzato per contenere la sequenza di caratteri rappresentata da questa stringa.

Esistono modi più prolissi per iterare sui caratteri di un array (regolare per loop, CharacterIterator , ecc.) Ma se si è disposti a pagare il costo toCharArray() per-ciascuno è il più conciso.

Question

Quindi voglio ripetere per ogni carattere in una stringa.

Così ho pensato:

for (char c : "xyz")

ma ottengo un errore del compilatore:

MyClass.java:20: foreach not applicable to expression type

Come posso fare questo?




String s = "xyz";
for(int i = 0; i < s.length(); i++)
{
   char c = s.charAt(i);
}




Per Travers an String puoi anche usare charAt() con la stringa.

piace :

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() è il metodo di gestione delle stringhe in java che aiuta a attraversare la stringa per un carattere specifico.




Puoi anche usare un lambda in questo caso.

    String s = "xyz";
    IntStream.range(0, s.length()).forEach(i -> {
        char c = s.charAt(i);
    });



Un'altra soluzione utile, puoi lavorare con questa stringa come array di String

for (String s : "xyz".split("")) {
    System.out.println(s);
}



Se si utilizza Java 8, è possibile utilizzare chars() su una String per ottenere un Stream di caratteri, ma sarà necessario eseguire il cast di int su un char quanto chars() restituisce un IntStream .

"xyz".chars().forEach(i -> System.out.print((char)i));

Se si utilizza Java 8 con Eclipse Collections , è possibile utilizzare la classe forEach metodo forEach con un riferimento lambda o metodo per iterare su tutti i caratteri in una String .

CharAdapter.adapt("xyz").forEach(c -> System.out.print(c));

Questo particolare esempio potrebbe anche usare un riferimento al metodo.

CharAdapter.adapt("xyz").forEach(System.out::print)

Nota: sono un committer per le raccolte di Eclipse.




In Java 8 possiamo risolverlo come:

String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));    

Il metodo chars () restituisce un IntStream come menzionato in doc :

Restituisce un flusso di int zero estendendo i valori char da questa sequenza. Qualsiasi carattere che mappa ad un punto codice surrogato viene passato attraverso non interpretato. Se la sequenza viene modificata durante la lettura del flusso, il risultato non è definito.

Perché usare forEachOrdered e non forEach ?

Il comportamento di forEach è esplicitamente non deterministico laddove come forEachOrdered esegue un'azione per ogni elemento di questo stream, nell'ordine di incontro dello stream se il flusso ha un ordine di incontro definito. Quindi forEach non garantisce che l'ordine venga mantenuto. Controlla anche questa question per ulteriori informazioni.

Potremmo anche usare codePoints() per stampare, vedere questa answer per maggiori dettagli.




È necessario convertire l'oggetto String in una matrice di caratteri utilizzando il metodo toCharArray () della 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);
}