Ottieni carattere stringa per indice - Java


231

So come elaborare l'indice di un certo carattere o numero in una stringa, ma esiste un metodo predefinito che posso usare per darmi il carattere all'ennesima posizione? Quindi nella stringa "pippo", se avessi chiesto il carattere con indice 0, avrebbe restituito "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 carattere quando viene invocato il metodo, ma una stringa (di lunghezza 1). E conosco il metodo substring (), ma mi chiedevo se ci fosse un modo più ordinato.


13
È? La risposta è piuttosto semplice.
ametren,

Hai notato che non vuole un charvalore? E sa come fare, substring()ma vuole solo un modo "più ordinato". Cordiali saluti, posso dire che substring()è il modo più pulito.
user845279,

3
@ user845279 Character.toStringsoddisfa tutti i requisiti necessari e non è affatto disordinato.
Ricardo Altamirano,

@pythonscript Sono d'accordo, ma non è molto diverso dall'uso substring()diretto.
user845279,

1
Sono in ritardo a questa festa, ma @RicardoAltamirano si sbaglia un po '. Il endIndex(secondo parametro) di String.substring(int, int)è un indice esclusivo e non genererà un'eccezione index + 1fintanto index < length()che è vero anche per l'ultimo carattere della stringa.
William Price,

Risposte:


340

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

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

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

Se non si desidera il risultato come chartipo di dati, ma piuttosto come stringa, si utilizzerà il Character.toStringmetodo:

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

Se vuoi maggiori informazioni sulla Characterclasse e sul toStringmetodo, ho estratto le mie informazioni dalla documentazione su Character.toString .


1
"La cosa importante qui è che non ricevo un carattere quando viene invocato il metodo, ma una stringa", ma grazie comunque (votazione): D
Bluefire,

1
Penso che la risposta di Sylvain Leroux sia migliore. doc su Character
Chaojun Zhong

Sono d'accordo con @ChaojunZhong questa è una risposta più adatta poiché non è consigliabile usare charAt () perché potresti avere problemi quando hai caratteri che richiedono 2 unità di codice.
bpunzalan,

43

Tu vuoi .charAt()

Ecco un tutorial

"mystring".charAt(2)

ritorna s

Se sei intenzionato ad avere una stringa, ci sono un paio di modi per convertire un carattere 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.


@ametren È preferibile la concatenazione di stringhe di stringhe Character.toString?
Ricardo Altamirano,

Penso che ciò possa dipendere da una preferenza personale. Si potrebbe anche fareString mychar = String.valueOf("mystring".charAt(2));
ametren

Ad accumulare, la mia preferenza personale in questo caso sarebbe String mychar = ""+"mystring".charAt(2);perché è la più concisa. Altri differiranno nella loro opinione su questo.
ametren,

10

Nessuna delle risposte proposte funziona con coppie surrogate utilizzate per codificare caratteri al di fuori del piano multilingue Unicode Basic .

Ecco un esempio che utilizza tre diverse tecniche per scorrere i "caratteri" di una stringa (incluso l'utilizzo dell'API stream Java 8). Si noti che questo esempio include i caratteri del piano multilingue complementare Unicode (SMP). È necessario un carattere 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 𓊃𓍿𓅓𓃡";

Iterate di caratteri

La prima soluzione è un semplice ciclo su tutta charla 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
}

Iterate di punti di codice

La seconda soluzione utilizza anche un ciclo esplicito, ma accedendo a singoli punti di codice con codePointAt e incrementando l'indice di ciclo di conseguenza a 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.
}

Scorrere i punti di codice utilizzando l'API Stream

La terza soluzione è sostanzialmente la stessa della seconda, 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 si esegue quel programma di test, si ottiene:

Using char iterator (do not work for surrogate pairs !)
T h e   q u i c k   b r o w n   ? ?   j u m p s   o v e r   t h e   l a z y   ? ? ? ? ? ? ? ? 

Using Java 1.5 codePointAt(works as expected)
T h e   q u i c k   b r o w n   𓃥   j u m p s   o v e r   t h e   l a z y   𓊃 𓍿 𓅓 𓃡 

Using Java 8 stream (works as expected)
T h e   q u i c k   b r o w n   𓃥   j u m p s   o v e r   t h e   l a z y   𓊃 𓍿 𓅓 𓃡 

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


8

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


Giusto. Ma, dal momento che char è un tipo primitivo, suppongo toString()che non funzionerà su di esso, ed valueOf()è solo per i numeri (penso, potrei sbagliarmi), quindi come posso convertire un char in una stringa?
Bluefire,

"nella domanda precedente, per" carattere "non intendo il tipo di dati carattere" - non leggo questo come "non accetterò un char"
ametren

@Bluefire Vedi la mia risposta. Character.toStringdovrebbe funzionare (è un metodo statico della Characterclasse.
Ricardo Altamirano,


5

charAtPotrebbe essere un approccio ibrido combinato con il requisito di non ottenere char

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

Ma non è davvero "più pulito" che substring()essere sincero.


5

È semplice come:

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

4

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

for (int i = 0; i<passCode.length(); i++)
{
    char letter = passCode.charAt(i);
    if (letter == ' ' )
    {
        System.out.println("Space at " + i);
    }
}

0

se qualcuno sta lottando con kotlin, il codice è:

var oldStr: String = "kotlin"
var firstChar: String = oldStr.elementAt(0).toString()
Log.d("firstChar", firstChar.toString())

questo restituirà il carattere in posizione 1, in questo caso k ricorda, l'indice inizia in posizione 0, quindi in questo esempio: kotlin sarebbe k = posizione 0, o = posizione 1, t = posizione 2, l = posizione 3, i = posizione 4 e n = posizione 5


-3

Come questo:

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

OP ha dichiarato che Stringsi desidera una lunghezza 1, non a char.
William Price,

Le altre 6 risposte, compresa quella accettata, suggerirono charAt()come possibile soluzione. Cosa aggiunge questa risposta?
Dan Getz,

6
Inoltre, sembra che tu stia suggerendo che charAt()utilizza indici basati su 1, avendo l'unico carattere diverso ain terza posizione. Se ciò fosse vero, sarebbe meglio per te dirlo o spiegarlo piuttosto che accennarlo. In realtà non è vero: charAt()usa indici basati su 0, così ssarà 'h'.
Dan Getz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.