n
Javaで文字列の最初の文字まで取得するには、最初にサイズチェックを行わず(インラインは許容されます)IndexOutOfBoundsException
、?
n
Javaで文字列の最初の文字まで取得するには、最初にサイズチェックを行わず(インラインは許容されます)IndexOutOfBoundsException
、?
回答:
ここにきちんとした解決策があります:
String upToNCharacters = s.substring(0, Math.min(s.length(), n));
意見:このソリューションは「きちんとしている」が、/ を明白な方法で使用するソリューションよりも実際には読みにくいと思います。読者がこのトリックを見たことがない場合は、コードを理解するのが難しいと考える必要があります。IMO、コードの意味は/ バージョンでより明白です。より明確で読みやすいソリューションについては、@ paxdiabloの回答を参照してください。if
else
if
else
車輪を再発明しないでください...:
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.substring(yourString, 0, n)
同じではないことを指摘することも役立つ場合がありますyourString.substring(0, n)
。前者はfrom StringUtils
で、後者は使用してString.substring
います(終了インデックスが文字列の長さを超える場合は例外になります)。
if (end > str.length()) { end = str.length();}
StringUtils.substring(String s, int start, int len)
はlenではなく、end-Indexです。
Apache Commons LangにはStringUtils.left
これを行う方法があります。
String upToNCharacters = StringUtils.left(s, n);
SOには完全ではない意味のクラスの質問があり、これは非常に危険です:-)
おそらく、除外した2つの方法のいずれかを使用することへの嫌悪感を説明できます。
if
ステートメントまたは例外をキャッチするコードでコードを実行したくないだけの場合は、次のようなヘルパー関数を使用して対処します。
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);
次のように、substringメソッドを使用します。
int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);
nが文字列の長さより大きい場合、1人のコメント投稿者が指摘したように、これは例外をスローします。簡単な解決策の1つは、これらすべてを句の条件if(s.length()<n)
にラップelse
することです。文字列全体を出力/返すだけにするか、別の方法で処理するかを選択できます。
Kotlinで開発できる運が良けれ
ば、を使用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;
}