インデックスによる文字列文字の取得-Java


231

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

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


13
そうですか?答えはかなり簡単です。
アメトレン

彼はchar価値を望んでいないことに気づきましたか?そして、彼はやり方を知っていますsubstring()が、単に「よりきちんとした」方法を望んでいます。参考までに、それsubstring()は最も卑劣な方法です。
user845279 2012年

3
@ user845279 Character.toStringは必要なすべての要件を満たし、煩雑ではありません。
Ricardo Altamirano

@pythonscript同意しますが、substring()直接使用する場合とそれほど変わりません。
user845279

1
私はこのパーティーに遅れましたが、@ RicardoAltamiranoは少し間違っています。のendIndex(2番目のパラメーター)String.substring(int, int)排他的なインデックスであり、その限り例外をスローしません -これは、文字列の最後の文字についても当てはまります。index + 1index < length()
ウィリアムプライス

回答:


340

あなたが探している方法はです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のドキュメントから情報を引き出しました


1
「ここで重要なのは、メソッドが呼び出されたときにcharを受信しないことですが、文字列を受け取ります」しかし、とにかく感謝(賛成):D
Bluefire

1
シルヴァン・ルルーの答えの方がいいと思います。キャラクターについてのドキュメント
-Chaojun Zhong 2018

@ChaojunZhongに同意します。charAt ()を使用することはお勧めできません。これは、2つのコード単位を必要とする文字がある場合に問題が発生するためです。
bpunzalan

43

あなたが欲しい .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));

例えば。


@ametren文字列と文字列の連結はより好ましいCharacter.toStringですか?
Ricardo Altamirano

それは個人的な好みの問題に帰着するかもしれません。あなたも行うことができますString mychar = String.valueOf("mystring".charAt(2));
アメトレン

重ねて言うと、この場合の私の個人的な好みはString mychar = ""+"mystring".charAt(2);、最も簡潔だからです。他の人はこれについての意見が異なります。
アメトレン

10

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

以下は、3つの異なる手法を使用して文字列の「文字」を反復処理する例です(Java 8ストリームAPIを使用するなど)。この例には、Unicode Supplementary Multilingual Plane(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.
}

Stream APIを使用してコードポイントを反復処理する

3番目のソリューションは基本的に2番目のソリューションと同じですが、Java 8ストリームAPIを使用します

/* 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   𓊃 𓍿 𓅓 𓃡 

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


8

substring()要件を考えると、かなり困っています。標準的な方法はcharAt()ですが、charデータ型は受け入れられないと述べました。


けっこうだ。しかし、charはプリミティブ型であるため、私はそれtoString()が機能しないと想定しvalueOf()、数値のみを対象としています(間違っていると思う)ので、charを文字列に変換するにはどうすればよいですか?
Bluefire

「上記の質問では、で『文字』私はcharデータ型を意味するものではありません」 - 「私は受け入れないように私はこれを読んでいないchar
ametren

@Bluefire私の答えを見てください。Character.toStringそれはからの静的メソッドです(動作するはずCharacterクラス。
リカルド・アルタミラーノ


5

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

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

しかし、それはsubstring()正直に言うと、実際には「きちんとしている」わけではありません。



4

これが正しいコードです。あなたがzybooksを使用している場合、これはすべての問題に答えます。

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

0

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

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

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


-3

このような:

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

OPはString、長さ1が望ましいが、ではないことを述べていcharます。
ウィリアムプライス

承認さcharAt()れたものを含む他の6つの回答は、可能な解決策として提案されました。この答えは何を追加しますか?
Dan Getz

6
また、3番目の位置にcharAt()ある唯一の異なる文字を持つことにより、1ベースのインデックスを使用することを示唆しているように見えますa。それが本当なら、それをほのめかすよりもあなたがそれを言うか説明するほうがよいでしょう。実際にそうでcharAt()はありません。0ベースのインデックスを使用sするため、になります'h'
ダン・ゲッツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.