265

文字列内の特定の文字または数字のインデックスを計算する方法を知っていますが、n番目の位置に文字を与えるために使用できる事前定義された方法はありますか?したがって、文字列「foo」で、インデックス0の文字を要求すると、「f」が返されます。

注-上記の質問では、「文字」とは、charデータ型ではなく、文字列内の文字または数字を意味します。ここで重要なのは、メソッドが呼び出されたときにcharを受け取らず、文字列(長さ1)を受け取ることです。そして、私はsubstring()メソッドについて知っていますが、もっときちんとした方法があるかどうか疑問に思いました。

4

12 に答える 12

383

あなたが探している方法はですcharAt。次に例を示します。

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

詳細については、のJavaドキュメントをString.charAt参照してください。別の簡単なチュートリアルが必要な場合は、これまたはこれ

結果をcharデータ型ではなく文字列として使用する場合は、次のCharacter.toStringメソッドを使用します。

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

CharacterクラスとtoStringメソッドの詳細が必要な場合は、Character.toStringのドキュメントから情報を取得しました。

于 2012-06-27T15:39:30.920 に答える
49

あなたが欲しい.charAt()

これがチュートリアルです

"mystring".charAt(2)

戻り値s

文字列を使用することに夢中になっている場合は、charを文字列に変換する方法がいくつかあります。

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

または

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

あるいは

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

例えば。

于 2012-06-27T15:39:24.500 に答える
10

提案された回答はいずれも、 Unicode BasicMultiligualPlaneの外部で文字をエンコードするために使用されるサロゲートペアに対しては機能しません。

これは、3つの異なる手法を使用して文字列の「文字」を反復処理する例です(Java 8ストリームAPIの使用を含む)。この例には、Unicode補足多言語面(SMP)の文字が含まれていることに注意してください。この例と結果を正しく表示するには、適切なフォントが必要です。

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

文字の反復

char最初の解決策は、すべての文字列に対する単純なループです。

/* 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
}

コードポイントの反復

2番目のソリューションも明示的なループを使用しますが、 codePointAtを使用して個々のコードポイントにアクセスし、 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.
}

StreamAPIを使用してコードポイントを反復処理します

3番目のソリューションは基本的に2番目のソリューションと同じですが、Java 8StreamAPIを使用しています。

/* 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
    });

結果

そのテストプログラムを実行すると、次のようになります。

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       

ご覧のとおり(象形文字を適切に表示できる場合)、最初のソリューションはUnicodeBMP以外の文字を適切に処理しません。一方、他の2つのソリューションは、サロゲートペアをうまく​​処理します。

于 2015-11-07T22:40:01.047 に答える
8

String.valueOf(char c)String.charAt(int index)のパラメーターとしてメソッドresultを使用できます。

String.valueOf(myString.charAt(3)) // This will return a string of the character on the 3rd position.
于 2012-06-27T15:45:31.660 に答える
8

あなたの要件を考えると、あなたはかなり立ち往生していsubstring()ます。標準的な方法はcharAt()ですが、charデータ型は受け入れないとおっしゃいました。

于 2012-06-27T15:40:24.960 に答える
5

charAtcharを取得しないという要件と組み合わせたハイブリッドアプローチは、

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

substring()しかし、それは正直に言うよりも本当に「きれい」ではありません。

于 2012-06-27T15:45:48.967 に答える
5

それは次のように簡単です:

String charIs = string.charAt(index) + "";
于 2012-06-27T15:52:02.660 に答える
4

正しいコードは次のとおりです。あなたがzybookを使用しているなら、これはすべての問題に答えます。

for (int i = 0; i<passCode.length(); i++)
{
    char letter = passCode.charAt(i);
    if (letter == ' ' )
    {
        System.out.println("Space at " + i);
    }
}
于 2015-11-21T16:51:15.740 に答える
0

誰かがkotlinで苦労している場合、コードは次のとおりです。

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

これにより、charが位置1に返されます。この場合、kは、インデックスが位置0から始まるため、このサンプルでは、​​kotlinはk =位置0、o =位置1、t =位置2、l=位置3になります。 i=位置4およびn=位置5

于 2019-07-29T13:12:59.730 に答える
0

charAtの代わりにCodePointAtを使用する方が安全です。strtngに絵文字があると、charAtが壊れることがあります。

于 2020-08-27T16:05:13.443 に答える
0

CharAt関数が機能しない

Edittext.setText(YourString.toCharArray(),0,1);

このコードは正常に機能しています

于 2021-02-09T13:51:20.783 に答える
-3

このような:

String a ="hh1hhhhhhhh";
char s = a.charAt(3);
于 2015-05-13T18:43:45.577 に答える