189

Java で文字列の最初の文字を取得するには、最初nにサイズ チェック (インラインは許容されます) を実行したり、IndexOutOfBoundsException.

4

7 に答える 7

398

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

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

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

于 2009-10-18T04:00:37.527 に答える
103

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

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"
于 2012-01-30T15:40:16.093 に答える
14
String upToNCharacters = String.format("%."+ n +"s", str);

変数の場合はひどいn(そのため、書式文字列を作成する必要があります) が、定数の場合はかなり明確です。

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

ドキュメント

于 2013-10-03T08:08:55.060 に答える
11

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);

これは、(他の回答へのコメントに基づいて)心配していると思われる場合に機能し、多くの文字列構築作業を行うときにコードの流れを壊すことはありません。

于 2009-10-18T04:02:09.490 に答える
2

次のように部分文字列メソッドを使用します。

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

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

于 2009-10-18T03:45:10.603 に答える