をString[]
接着剤の紐でつなぎたい。これに機能はありますか?
をString[]
接着剤の紐でつなぎたい。これに機能はありますか?
回答:
始まっJava8を使用することが可能ですString.join()
。
String.join(", ", new String[]{"Hello", "World", "!"})
生成:
Hello, World, !
それ以外の場合、Apache Commons Langには、配列を結合してを作成する関数をStringUtils
持つクラスがあります。join
String
例えば:
StringUtils.join(new String[] {"Hello", "World", "!"}, ", ")
以下を生成しますString
:
Hello, World, !
String.join()
、Java 8で導入された新しいメソッドへの参照を追加することをお勧めします。このようにして、この受け入れられた回答を読んでいる膨大な数の人々がその知識から利益を得るでしょう。現在、この事実に言及している最高投票の回答はかなり下に失われています...
String.join()
のみ機能することは言及する価値があります。List<CharSequence>
CharSequence[]
あなたがアンドロイドで何を使うべきかを探していたなら、それは:
String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens)
例えば:
String joined = TextUtils.join(";", MyStringArray);
Java 8で使用できます
1)ストリームAPI:
String[] a = new String[] {"a", "b", "c"};
String result = Arrays.stream(a).collect(Collectors.joining(", "));
2)新しいString.joinメソッド:https ://stackoverflow.com/a/21756398/466677
3)java.util.StringJoinerクラス:http : //docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html
このような関数は、約10行のコードで簡単に記述できます。
String combine(String[] s, String glue)
{
int k = s.length;
if ( k == 0 )
{
return null;
}
StringBuilder out = new StringBuilder();
out.append( s[0] );
for ( int x=1; x < k; ++x )
{
out.append(glue).append(s[x]);
}
return out.toString();
}
substring()を使用する代わりに少しmod:
//join(String array,delimiter)
public static String join(String r[],String d)
{
if (r.length == 0) return "";
StringBuilder sb = new StringBuilder();
int i;
for(i=0;i<r.length-1;i++){
sb.append(r[i]);
sb.append(d);
}
sb.append(r[i]);
return sb.toString();
}
.append()
それぞれ2回使用する方が良いですか?String
Googleグアバのライブラリにもこのような機能があります。String []の例は、APIからも確認できます。
すでにAPIで説明されているように、ビルダーメソッドの不変性に注意してください。
それはあなたのケースで動作するようにオブジェクトの配列を受け入れることができます。以前の経験では、反復可能で正常に動作するスタックに参加してみました。
私からのサンプル:
Deque<String> nameStack = new ArrayDeque<>();
nameStack.push("a coder");
nameStack.push("i am");
System.out.println("|" + Joiner.on(' ').skipNulls().join(nameStack) + "|");
プリントアウト: |i am a coder|
与えられた:
String[] a = new String[] { "Hello", "World", "!" };
次に、接着剤が "、"であるcoobirdの回答の代替として:
Arrays.asList(a).toString().replaceAll("^\\[|\\]$", "")
または、「&amp;」などの別の文字列と連結します。
Arrays.asList(a).toString().replaceAll(", ", " & ").replaceAll("^\\[|\\]$", "")
ただし、これは、配列またはリストの値に文字列「、」が含まれていないことがわかっている場合にのみ機能します。
Arrays.asList(a).toString()
私がやりたかったことのために働いた
Spring Frameworkを使用している場合は、StringUtilsクラスがあります。
import static org.springframework.util.StringUtils.arrayToDelimitedString;
arrayToDelimitedString(new String[] {"A", "B", "C"}, "\n");
コアではありません。「java array join string glue」を検索すると、これを実現する方法のコードスニペットがいくつか表示されます。
例えば
public static String join(Collection s, String delimiter) {
StringBuffer buffer = new StringBuffer();
Iterator iter = s.iterator();
while (iter.hasNext()) {
buffer.append(iter.next());
if (iter.hasNext()) {
buffer.append(delimiter);
}
}
return buffer.toString();
}
配列から文字列への迅速な変換を求めてここに着いた場合は、Arrays.toString()を試してください。
Object[]
渡された文字列表現を作成します。結果は角括弧("[]"
)で囲まれ、各要素はを介して文字列に変換され、String.valueOf(Object)
で区切られ", "
ます。配列の場合null
は、"null"
返されます。
ちょうどのために、「私は最短1をした」挑戦、ここでは鉱山です。)
反復:
public static String join(String s, Object... a) {
StringBuilder o = new StringBuilder();
for (Iterator<Object> i = Arrays.asList(a).iterator(); i.hasNext();)
o.append(i.next()).append(i.hasNext() ? s : "");
return o.toString();
}
再帰的:
public static String join(String s, Object... a) {
return a.length == 0 ? "" : a[0] + (a.length == 1 ? "" : s + join(s, Arrays.copyOfRange(a, 1, a.length)));
}
copyOfRange()
")には非効率的です。
私が知っている組み込みのものはありません。
Apache Commons Langには、StringUtils
多くの結合関数を含むと呼ばれるクラスがあります。
これが私のやり方です。
private String join(String[] input, String delimiter)
{
StringBuilder sb = new StringBuilder();
for(String value : input)
{
sb.append(value);
sb.append(delimiter);
}
int length = sb.length();
if(length > 0)
{
// Remove the extra delimiter
sb.setLength(length - delimiter.length());
}
return sb.toString();
}
同様の選択肢
/**
* @param delimiter
* @param inStr
* @return String
*/
public static String join(String delimiter, String... inStr)
{
StringBuilder sb = new StringBuilder();
if (inStr.length > 0)
{
sb.append(inStr[0]);
for (int i = 1; i < inStr.length; i++)
{
sb.append(delimiter);
sb.append(inStr[i]);
}
}
return sb.toString();
}
私のスピン。
public static String join(Object[] objects, String delimiter) {
if (objects.length == 0) {
return "";
}
int capacityGuess = (objects.length * objects[0].toString().length())
+ ((objects.length - 1) * delimiter.length());
StringBuilder ret = new StringBuilder(capacityGuess);
ret.append(objects[0]);
for (int i = 1; i < objects.length; i++) {
ret.append(delimiter);
ret.append(objects[i]);
}
return ret.toString();
}
public static String join(Object... objects) {
return join(objects, "");
}
Functional Javaライブラリーを使用していて、何らかの理由でJava 8のStreamsを使用できない場合(Android + Retrolambdaプラグインを使用している場合など)は、次の機能的なソリューションがあります。
String joinWithSeparator(List<String> items, String separator) {
return items
.bind(id -> list(separator, id))
.drop(1)
.foldLeft(
(result, item) -> result + item,
""
);
}
これは最も効率的な方法ではありませんが、小さなリストには効果的です。
StringBuilderを使用して、次のようにします。
public static String join(String[] source, String delimiter) {
if ((null == source) || (source.length < 1)) {
return "";
}
StringBuilder stringbuilder = new StringBuilder();
for (String s : source) {
stringbuilder.append(s + delimiter);
}
return stringbuilder.toString();
} // join((String[], String)
s + delimiter
(プラス演算子を使用した文字列連結)は、を使用する目的全体を無効にしますStringBuilder
。
私がよく使う簡単な速記テクニックがあります。
String op = new String;
for (int i : is)
{
op += candidatesArr[i-1]+",";
}
op = op.substring(0, op.length()-1);
java.util.Arraysには「asList」メソッドがあります。java.util.List / ArrayList APIと一緒に使用すると、必要なものがすべて提供されます。;
private static String[] join(String[] array1, String[] array2) {
List<String> list = new ArrayList<String>(Arrays.asList(array1));
list.addAll(Arrays.asList(array2));
return list.toArray(new String[0]);
}