web-dev-qa-db-ja.com

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

Javaの文字列の最初のn文字まで取得するには、最初にサイズチェックを実行せず(インラインは許容)、またはIndexOutOfBoundsExceptionを危険にさらすにはどうすればよいですか?

141
antony.trupe

ここにきちんとした解決策があります:

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

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

323
Stephen C

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

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"
77
Nickkk

Apache Commons Lang には StringUtils.left があります。

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

SOにはある種の質問がありますが、これは時々完全な意味を成しません。これは危険なほど近いです:-)

おそらく、除外した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);

これは、(他の回答へのコメントに基づいて)心配しているように見える場合に機能します。多くの文字列作成作業を行うときにコードのフローを中断しません。

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

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

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

ドキュメント

10
13ren

次のように、サブストリングメソッドを使用します。

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

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

3
Matt Boehm

Kotlinで開発するのに十分な運があれば、
takeを使用して目標を達成できます。

val someString = "hello"

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