サイズをチェックしたり、境界が外れたりせずに、文字列の最初のn文字を取得するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1583940

質問

どうすれば最初に到達できますか n 最初にサイズチェックをせずにJavaの文字列の文字(インラインは許容されます)またはリスク IndexOutOfBoundsException?

役に立ちましたか?

解決

これがきちんとした解決策です:

String upToNCharacters = s.substring(0, Math.min(s.length(), n));

意見:この解決策は「きちんと」ですが、実際にはそうだと思います 読みやすい 使用するソリューションよりも if / else 明らかな方法で。読者がこのトリックを見ていない場合、彼/彼女は もっと一生懸命考えてください コードを理解するため。 IMO、コードの意味はより明白です if / else バージョン。クリーナー /より読みやすいソリューションについては、 @paxdiabloの回答を参照してください。

他のヒント

車輪を再発明しないでください...:

org.apache.commons.lang.StringUtils.substring(String s, int start, int len)

Javadoc 言う:

StringUtils.substring(null, *, *)    = null
StringUtils.substring("", * ,  *)    = "";
StringUtils.substring("abc", 0, 2)   = "ab"
StringUtils.substring("abc", 2, 0)   = ""
StringUtils.substring("abc", 2, 4)   = "c"
StringUtils.substring("abc", 4, 6)   = ""
StringUtils.substring("abc", 2, 2)   = ""
StringUtils.substring("abc", -2, -1) = "b"
StringUtils.substring("abc", -4, 2)  = "ab"

したがって:

StringUtils.substring("abc", 0, 4) = "abc"

アパッチコモンズラング があります StringUtils.left このための方法。

String upToNCharacters = StringUtils.left(s, n);

質問のクラスがありますので、時には完全な意味ではなく、これは危険なほど近くにあります:-)

おそらく、あなたが除外した2つの方法のいずれかを使用することへの嫌悪感を説明することができます。

コードを塗りたくないからといって if ステートメントまたは例外キャッチコード、1つのソリューションは、次のようなものを処理するヘルパー関数を使用することです。

static String substring_safe (String s, int start, int len) { ... }

事前に長さをチェックし、それに応じて行動します(小さな文字列またはスペースでパッドを返します)。

次に、コードで心配する必要はありません。電話してください。

String s2 = substring_safe (s, 10, 7);

それ以外の:

String s2 = s.substring (10,7);

これは、あなたが心配しているように見える場合(他の回答へのコメントに基づいて)、多くの文字列の構築を行うときにコードの流れを破ることなく機能します。

String upToNCharacters = String.format("%."+ n +"s", str);

ひどい場合 n 変数です(したがって、フォーマット文字列を作成する必要があります)が、定数がかなり明確であるかどうかは明らかです。

String upToNCharacters = String.format("%.10s", str);

ドキュメント

次のように、サブストリング方法を使用します。

int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);

nが文字列の長さよりも大きい場合、1人のコメンターが指摘したように、これは例外をスローします。簡単な解決策の1つは、これらすべてを状態に包むことです if(s.length()<n) あなたの中で else 句、文字列全体を印刷/返品するか、別の方法で処理するかどうかを選択できます。

あなたがコトリンと一緒に開発するのに十分幸運なら、
使用できます take あなたの目標を達成するために。

val someString = "hello"

someString.take(10) // result is "hello"
someString.take(4) // result is "hell" )))

ApacheCommonsは私を驚かせました、StringUtils.abbreviate(String str, int maxWidth) 「...」を追加すると、Postfixを変更するオプションはありません。WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd) 次の空きスペースを尊敬しています。

私はこれをここに残すつもりです:

public static String abbreviate(String s, int maxLength, String appendToEnd) {
    String result = s;
    appendToEnd = appendToEnd == null ? "" : appendToEnd;
    if (maxLength >= appendToEnd.length()) {
        if (s.length()>maxLength) {
            result = s.substring(0, Math.min(s.length(), maxLength - appendToEnd.length())) + appendToEnd;
        }
    } else {
        throw new StringIndexOutOfBoundsException("maxLength can not be smaller than appendToEnd parameter length.");
    }
    return result;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top