Ottieni caratteri stringa per indice – Java

So come calcolare l’indice di un certo carattere o numero in una stringa, ma esiste un metodo predefinito che posso usare per darmi il personaggio all’ennesimo posto? Quindi nella stringa “pippo”, se chiedessi il carattere con indice 0, restituirebbe “f”.

Nota: nella domanda precedente, per “carattere” non intendo il tipo di dati char, ma una lettera o un numero in una stringa. La cosa importante qui è che non ricevo un char quando viene invocato il metodo, ma una stringa (di lunghezza 1). E so del metodo substring (), ma mi chiedevo se esistesse un modo più ordinato.

Il metodo che stai cercando è charAt . Ecco un esempio:

 String text = "foo"; char a_char = text.charAt(0); System.out.println(a_char); // Prints f 

Per ulteriori informazioni, consultare la documentazione Java su String.charAt . Se vuoi un altro semplice tutorial, questo o questo .

Se non si desidera il risultato come un tipo di dati char , ma piuttosto come una stringa, si utilizzerà il metodo Character.toString :

 String text = "foo"; String a_letter = Character.toString(text.charAt(0)); System.out.println( a_letter ); // Prints f 

Se vuoi maggiori informazioni sulla class di Character e sul metodo toString , ho estratto le mie informazioni dalla documentazione su Character.toString .

Vuoi .charAt()

Ecco un tutorial

 "mystring".charAt(2) 

ritorna s

Se si è convinti di avere una stringa, ci sono un paio di modi per convertire un char in una stringa:

 String mychar = Character.toString("mystring".charAt(2)); 

O

 String mychar = ""+"mystring".charAt(2); 

O anche

 String mychar = String.valueOf("mystring".charAt(2)); 

Per esempio.

Sei abbastanza bloccato con la substring() , date le tue esigenze. Il modo standard sarebbe charAt() , ma hai detto che non accetti un tipo di dati char.

È ansible utilizzare il risultato del metodo String.charAt(int index) come parametro per String.valueOf (char c) .

 String.valueOf(myString.charAt(3)) // This will return a string of the character on the 3rd position. 

È semplice come:

 String charIs = string.charAt(index) + ""; 

Un approccio ibrido che combina charAt con la tua esigenza di non ottenere char potrebbe essere

 newstring = String.valueOf("foo".charAt(0)); 

Ma non è davvero “più ordinato” di substring() per essere onesti.

Nessuna delle risposte proposte funziona per le coppie surrogate utilizzate per codificare i caratteri al di fuori del piano multilingue multilivello Unicode .

Ecco un esempio che utilizza tre diverse tecniche per iterare sui “caratteri” di una stringa (incluso l’API di stream Java 8). Si prega di notare che questo esempio include caratteri di Unicode Supplementary Plilingual Plane (SMP). È necessario un font appropriato per visualizzare correttamente questo esempio e il risultato.

 // String containing characters of the Unicode // Supplementary Multilingual Plane (SMP) // In that particular case, hieroglyphs. String str = "The quick brown 𓃥 jumps over the lazy 𓊃𓍿𓅓𓃡"; 

Iterare di caratteri

La prima soluzione è un semplice loop su tutti i char della stringa:

 /* 1 */ System.out.println( "\n\nUsing char iterator (do not work for surrogate pairs !)"); for (int pos = 0; pos < str.length(); ++pos) { char c = str.charAt(pos); System.out.printf("%s ", Character.toString(c)); // ^^^^^^^^^^^^^^^^^^^^^ // Convert to String as per OP request } 

Iterare dei punti di codice

Anche la seconda soluzione utilizza un ciclo esplicito, ma accede a singoli punti di codice con codePointAt e incrementando l'indice di loop di conseguenza in charCount :

 /* 2 */ System.out.println( "\n\nUsing Java 1.5 codePointAt(works as expected)"); for (int pos = 0; pos < str.length();) { int cp = str.codePointAt(pos); char chars[] = Character.toChars(cp); // ^^^^^^^^^^^^^^^^^^^^^ // Convert to a `char[]` // as code points outside the Unicode BMP // will map to more than one Java `char` System.out.printf("%s ", new String(chars)); // ^^^^^^^^^^^^^^^^^ // Convert to String as per OP request pos += Character.charCount(cp); // ^^^^^^^^^^^^^^^^^^^^^^^ // Increment pos by 1 of more depending // the number of Java `char` required to // encode that particular codepoint. } 

Iterare sui punti del codice usando l'API Stream

La terza soluzione è fondamentalmente la stessa del secondo, ma utilizzando l' API Java 8 Stream :

 /* 3 */ System.out.println( "\n\nUsing Java 8 stream (works as expected)"); str.codePoints().forEach( cp -> { char chars[] = Character.toChars(cp); // ^^^^^^^^^^^^^^^^^^^^^ // Convert to a `char[]` // as code points outside the Unicode BMP // will map to more than one Java `char` System.out.printf("%s ", new String(chars)); // ^^^^^^^^^^^^^^^^^ // Convert to String as per OP request }); 

risultati

Quando esegui quel programma di test, ottieni:

 Using char iterator (do not work for surrogate pairs !) T hequickbrown ? ? jumpsoverthelazy ? ? ? ? ? ? ? ? Using Java 1.5 codePointAt(works as expected) T hequickbrown 𓃥 jumpsoverthelazy 𓊃 𓍿 𓅓 𓃡 Using Java 8 stream (works as expected) T hequickbrown 𓃥 jumpsoverthelazy 𓊃 𓍿 𓅓 𓃡 

Come puoi vedere (se sei in grado di visualizzare correttamente i geroglifici), la prima soluzione non gestisce i caratteri correttamente al di fuori del BMP Unicode. D'altra parte, le altre due soluzioni si adattano bene alle coppie surrogate.

Ecco il codice corretto. Se stai usando zybooks questo risponderà a tutti i problemi.

 for (int i = 0; i 

Come questo:

 String a ="hh1hhhhhhhh"; char s = a.charAt(3);