これは初心者向けの質問ですが、JavaでのC#の文字列操作に相当するものはありますか?
具体的には、とについて話しString.Format
ているString.Join
。
これは初心者向けの質問ですが、JavaでのC#の文字列操作に相当するものはありますか?
具体的には、とについて話しString.Format
ているString.Join
。
回答:
Java Stringオブジェクトにはformat
メソッド(1.5以降)がありますが、メソッドはありませんjoin
。
まだ含まれていない便利な文字列ユーティリティメソッドを取得するには、org.apache.commons.lang.StringUtilsを使用できます。
String.join()
メソッドを導入していることを反映するには、この回答を更新する必要があります。
String.format。参加に関しては、あなた自身で書く必要があります:
static String join(Collection<?> s, String delimiter) {
StringBuilder builder = new StringBuilder();
Iterator<?> iter = s.iterator();
while (iter.hasNext()) {
builder.append(iter.next());
if (!iter.hasNext()) {
break;
}
builder.append(delimiter);
}
return builder.toString();
}
上記はhttp://snippets.dzone.com/posts/show/91からのものです
Java 8以降、 join()
、Stringクラスの2つのクラスメソッドとして使用できるようになりました。どちらの場合も、最初の引数は区切り文字です。
個別CharSequence
のを追加の引数として渡すことができます。
String joined = String.join(", ", "Antimony", "Arsenic", "Aluminum", "Selenium");
// "Antimony, Arsenic, Alumninum, Selenium"
または、あなたは渡すIterable<? extends CharSequence>
ことができます:
List<String> strings = new LinkedList<String>();
strings.add("EX");
strings.add("TER");
strings.add("MIN");
strings.add("ATE");
String joined = String.join("-", strings);
// "EX-TER-MIN-ATE"
Java 8は、次のStringJoiner
ように使用できる新しいクラスも追加します。
StringJoiner joiner = new StringJoiner("&");
joiner.add("x=9");
joiner.add("y=5667.7");
joiner.add("z=-33.0");
String joined = joiner.toString();
// "x=9&y=5667.7&z=-33.0"
TextUtils.joinはAndroidで使用できます
参加に関しては、これは少し複雑に見えないかもしれません:
public String join (Collection<String> c) {
StringBuilder sb=new StringBuilder();
for(String s: c)
sb.append(s);
return sb.toString();
}
私は好きなだけJava 5構文を使用することができません(それを信じるかどうか、最近1.0.xを使用しています)。 。
編集の追加:文字列の追加は遅くなる可能性がありますが、GUIコードまたはいくつかの短時間実行ルーチンで作業している場合、.005秒または.006を取るかどうかは実際には関係ないため、「joinMe」というコレクションがある場合は既存の文字列 "target"に追加したい場合、これをインライン化するだけで恐ろしいことではありません。
for(String s : joinMe)
target += s;
これは非常に非効率的(そして悪い習慣)ですが、何千もの文字列が存在するか、これが巨大なループ内にあるか、コードが本当にパフォーマンスクリティカルでない限り、何も知覚できません。
さらに重要なのは、覚えやすく、短く、すばやく読みやすいことです。パフォーマンスは、常にデザインの選択において自動的に勝つとは限りません。
これはかなり単純な答えです。+=
コードが少ないので使用し、オプティマイザに変換させてStringBuilder
ください。この方法を使用すると、ループ内の「is last」チェックを実行する必要がなく(パフォーマンスの向上)、最後の区切り文字を削除することを心配する必要がありません。
Iterator<String> iter = args.iterator();
output += iter.hasNext() ? iter.next() : "";
while (iter.hasNext()) {
output += "," + iter.next();
}
単純な結合関数を追加するためにApacheライブラリ全体をインポートしたくなかったので、これが私のハックです。
public String join(String delim, List<String> destinations) {
StringBuilder sb = new StringBuilder();
int delimLength = delim.length();
for (String s: destinations) {
sb.append(s);
sb.append(delim);
}
// we have appended the delimiter to the end
// in the previous for-loop. Let's now remove it.
if (sb.length() >= delimLength) {
return sb.substring(0, sb.length() - delimLength);
} else {
return sb.toString();
}
}
removeCharAt
存在しませんし、全体の機能は、もはや文字列を返す...これを修正します。
複数の文字列を1つに結合(連結)する場合は、StringBuilderを使用する必要があります。使用するよりもはるかに優れています
for(String s : joinMe)
target += s;
StringBuilderは同期を使用しないため、StringBufferよりもパフォーマンスが若干向上します。
このような汎用ユーティリティメソッドの場合、(最終的には)多くの状況で何度も呼び出されるため、効率的にして、多くの一時オブジェクトを割り当てないでください。私たちは数多くのさまざまなJavaアプリのプロファイルを作成してきましたが、ほとんどの場合、文字列の連結と文字列/ char []の割り当てにはかなりの時間/メモリを消費します。
再利用可能なコレクション-> stringメソッドは、最初に必要な結果のサイズを計算し、次にその初期サイズでStringBuilderを作成します。これにより、文字列を追加するときに使用される内部char []の不必要な二重化/コピーが回避されます。
私は自分で書いた:
public static String join(Collection<String> col, String delim) {
StringBuilder sb = new StringBuilder();
Iterator<String> iter = col.iterator();
if (iter.hasNext())
sb.append(iter.next().toString());
while (iter.hasNext()) {
sb.append(delim);
sb.append(iter.next().toString());
}
return sb.toString();
}
しかしCollection
、JSPではサポートされていないため、タグ関数については次のように記述しました。
public static String join(List<?> list, String delim) {
int len = list.size();
if (len == 0)
return "";
StringBuilder sb = new StringBuilder(list.get(0).toString());
for (int i = 1; i < len; i++) {
sb.append(delim);
sb.append(list.get(i).toString());
}
return sb.toString();
}
そして.tld
ファイルに入れます:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
<function>
<name>join</name>
<function-class>com.core.util.ReportUtil</function-class>
<function-signature>java.lang.String join(java.util.List, java.lang.String)</function-signature>
</function>
</taglib>
そして、JSPファイルで次のように使用します。
<%@taglib prefix="funnyFmt" uri="tag:com.core.util,2013:funnyFmt"%>
${funnyFmt:join(books, ", ")}
StringUtilsは、Apache Commons Langライブラリの非常に便利なクラスです。
MessageFormat.format()
C#のように機能するものがありString.Format()
ます。
ここにはString.Joinの過度に複雑な実装がたくさんあります。Java 1.8がなく、新しいライブラリをインポートしたくない場合は、以下の実装で十分です。
public String join(Collection<String> col, String delim) {
StringBuilder sb = new StringBuilder();
for ( String s : col ) {
if ( sb.length() != 0 ) sb.append(delim);
sb.append(s);
}
return sb.toString();
}
ArrayList<Double> j=new ArrayList<>;
j.add(1);
j.add(.92);
j.add(3);
String ntop=j.toString(); //ntop= "[1, 0.92, 3]"
したがって、基本的に、文字列ntopはコレクション全体の値をカンマ区切りと角かっこで格納します。