【Java入門】Stringクラスのsubstingについて
  • facebookページ
  • twitterページ
  • 2017.09.09

    【Java入門】Stringクラスのsubstingについて

    Stringクラスの構造

    Javaには様々な基本データ型があります。たとえば、整数を表すint、実数を用いるdouble、さらには真偽値を表すbooleanなどです。

    Javaには、文字コードを表す型であるchar形は存在しますが、文字列を表すデータ型は存在しません。

    代わりに、文字列を表したいときは、Javaの基本クラスの一つである、Stringクラスを用います。例えば、”abc”という文字列は、これ自体がStringクラスのインスタンスになるのです。

    ところで、Stringクラスは、クラスである以上当然のことながらメソッドを持っています。代表的なものが、String同士の比較を行うequalsメソッドですが、そのほかにもたくさんのメソッドがあります。

    その中で、特にここではsubstringメソッドについて解説していくこととしましょう。

    substringメソッド

    substringメソッドとは、文字列の部分を抽出するメソッドです。書式は以下の通りです。

    substring

    public String substring(int startIndex, int endIndex)
    この文字列の部分文字列である新しい文字列を返します。部分文字列は、指定された startIndex から始まり、インデックス endIndex – 1 にある文字までです。

    したがって、部分文字列の長さはendIndex – startIndex になります。

    文字列の分割

    ここで気を付けてほしいのが、文字の開始位置が、startIndexであるのに対し、終了インデックスがendIndex – 1となっている点です。

    これは一体どういうことなのでしょう。具体例を挙げてみてみることにします。

    例えば、ここで

    という処理をすると、どのような結果が返ってくるのでしょうか。

    まずスタートの文字ですが、

    0 –> H
    1 –> e
    2 –> l
    3 –> l
    4 –> o
    5 –> !

    といった具合にインデックスがついていますそのため、2にあたるものは、最初の「l」です。

    それに対し、終わりの位置を指すインデックスは

    1 –> H
    2 –> e
    3 –> l
    4 –> l
    5 –> o
    6 –> !

    といった風に考える必要があり、終わりは「o」となります。

    つまり、この処理で得られる文字列は、”llo”ということになります。

    大変奇妙な感じがしますが、substringメソッドはこのように、開始位置と終了位置のインデックスの指定の仕方が違うのです。

    この点や特に初心者が混乱しやすい部分なので、十分に気を付けてプログラミングをする必要があります。

    では実際に、その通りになるかどうかを以下のサンプルを入力し、実行してみてください。

    実行結果は、以下のようになります。

    Hello World!のsubstring(2,5)は「llo」です
    こんにちはのsubstring(2,4)は「にち」です

    分割時の注意点

    このように、初心者には混乱をしやすい仕様であるsubstringメソッドですが、実は、プログラミング上級者を悩ませるような問題も時として起こります。

    その問題とは、全角文字と半角文字を区別する際の問題です。

    ベテランプログラマーが陥る疑問

    たとえば、全角文字で”こんにちは“という文字列があったとします。これにインデックスを付けると、以下のようになります。

    0 –> こ
    1 –> ん
    2 –> に
    3 –> ち
    4 –> は

    つまり、半角文字であろうと、全角文字であろうと一文字は一文字だと考えるわけです。

    これは、プログラミング初心者にとっては、特に問題がなく受け入れられるのですが、ある程度キャリアの長いベテランプログラマー、特にC/C++言語でのプログラミングを長くやっているプログラマーはしばしば混乱してしまうことがあります。

    C/C++で長年プログラミングをしてきたプログラマーは、全角文字は半角文字2文字分であると理解している人が少なくありません。

    それ自体は間違いではないのですが、javaではそもそも、文字コードとしてユニコード(unicode)を用いているので、全角でも半角でも一文字であることには違いがないのです。

    ユニコード

    最初に文字コードを標準化したのはアメリカであり、その文字コードはASCII(American Standard Code for Information Interchange)と呼ばれています。

    ASCIIコードはもともと8ビットで、最大255文字の数値やアルファベット、記号などしか表せない文字コードでした。

    そこえ、各国は独自にばらばらな文字コードを開発し使っていました。例えば日本では、代表的なものとしてShift_JISが作られました。

    しかし、複数の文字コードが乱立する状態は非常に不便であり、それを解消するために作られたのが、ユニコードです。

    では、ユニコードとは、いったいどのような文字コードなのでしょうか。

    ユニコードで規定されている文字それぞれに、最大で21ビットの数値が割り振られています。この数値をコードポイントと言います。

    コードポイントの数値で文字を表すため、「U+16進数」表記として、という書き方が用いられます。例えば、「a」であればU+61、「あ」であればU+3042と表記されます。

    ただ、この21ビットのコードポイントがそのままテキストファイルに保存されるわけではありません。コードポイントは、一定のルールでバイト列に符号化されます。

    その方法は複数あり、そのためユニコードに該当するデータの表記方法は複数存在します。Javaで標準的に用いられるのは、utf-8と呼ばれる表記です。

    ユニコードを用いると、全角文字、半角文字共に一文字となります。

    それに対し、前述したShift_JISのようなコードでは、全角文字のコードを2バイトで表すため、古くからC言語のプログラミングになれたプログラマーはJavaの表記を見て混乱してしまうことがあるのです。

    例外処理に注意

    また、もう一つこのメソッドを用いる際に気を付けなくてはならないのが例外処理です。

    このメソッドは、IndexOutOfBoundsExceptionを発生させる可能性があります。

    これは、インデックスが範囲を超えたということを意味する例外です。

    具体的には、startIndex が負の値である場合、endIndexがこの String オブジェクトの文字列の長さより大きい場合、そしてstartIndex が endIndex より大きい場合にこの例外が発生します。

    実際のアプリに使用するときは、きちんと例外処理を施すか、このような例外が発生しないようにしたプログラミングが必要です。

    最後に

    このように、Stringクラスのsubstringクラスには、注意しなければいけない約束事があり、かつ扱われている文字コードがutf-8であることを注意する必要があります。

    ただ、単純なメソッドですが文字列を操作するような処理の中では意外とよく使われるメソッドなのです。

    なお、文字列を「,」やスペースなど、特殊な記号やルールで複数に分割する場合は、splitメソッドで分割するほうがsubstringメソッドよりもはるかに効率的です。


    ポテパンが提供するサービスについて

    本メディア「ポテパンスタイル」を運営する株式会社ポテパンは、エンジニアキャリア領域で複数サービスを提供しています。

    ポテパンフリーランス

    ポテパンフリーランス

    フリーランスエンジニアの方に高単価案件をご紹介しております。弊社ではフリーランス案件を常時300件ほど保有しており、その中からあなたに適した案件をご案内いたします。また、これから独立してフリーランスになる方の無料個別相談も承っております。フリーランスになった後の案件獲得方法やお金面(税金や保険など)についてお答えいたします!

    ポテパンキャリア

    ポテパンキャリア

    エンジニア職専門の転職エージェントです。ポテパンキャリアでは、技術のわかるエージェントがあなたの転職をサポートします。エージェント自身がエンジニアなので、あなたと同じ目線で仕事内容や今後のキャリアについて一緒に考えることができます。

    ポテパンキャンプ

    ポテパンキャンプ

    ポテパンキャンプでは、RubyにてゼロからオリジナルのECサイトを作り上げてる3ヶ月間の実践型カリキュラムを提供しております。すでに本スクールの卒業生は、エンジニア職として様々な企業様に就職しております。なお、本スクールは受講料10万円と他社スクールに比べ格安となっており、またポテパンからご紹介させていただいた企業へ就職が決まった場合は、全額キャッシュバックいたします。



    株式会社ポテパンは、企業とエンジニアの最適なマッチングを追求しています。気になるサービスがあれば、ぜひ覗いてみてください!

    ポテキャンバナー ポテキャリバナー

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア

    関連ワード

    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE