web-dev-qa-db-ja.com

Java:PHPのjoin()のような配列の関数?

String[]をグルーストリングで結合したい。これに機能はありますか?

252
Nick Heiner

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, !
307
coobird

Androidで使用するものを探している場合は、次のとおりです。

String Android.text.TextUtils.join(CharSequence delimiter, Object[] tokens)

例えば:

String joined = TextUtils.join(";", MyStringArray);
71
Noah

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

55
Marek Gregor

このような関数は、約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();
}
52
Jay

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();
}
25
everlasto

最近の多くの質問と同様、Java 8が助けになりました:


Java 8は、Java.lang.Stringに新しい静的メソッドを追加しました。

public static String join(CharSequence delimeter, CharSequence... elements);

それを使用して:

String s = String.join(", ", new String[] {"Hello", "World", "!"});

結果:

"Hello, World, !"
18
icza

Google guavaのライブラリには、 この種の機能 もあります。 APIからもString []の例を見ることができます。

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|

14
bertie

与えられた:

String[] a = new String[] { "Hello", "World", "!" };

その後、クーバードの答えの代替として、接着剤が「、」である場合:

Arrays.asList(a).toString().replaceAll("^\\[|\\]$", "")

または、「&amp;」などの別の文字列と連結します。

Arrays.asList(a).toString().replaceAll(", ", " &amp; ").replaceAll("^\\[|\\]$", "")

ただし...これは、配列またはリストの値に文字列「、」が含まれていないことがわかっている場合にのみ機能します。

9

Spring Framework を使用している場合、 StringUtils クラスがあります。

import static org.springframework.util.StringUtils.arrayToDelimitedString;

arrayToDelimitedString(new String[] {"A", "B", "C"}, "\n");
9
devstopfix

コアではありません「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();
}
8
Brad Beattie

配列から文字列への迅速な変換を探してここに着いた場合は、 Arrays.toString() を試してください。

渡されたObject[]の文字列表現を作成します。結果は角括弧("[]")で囲まれ、各要素はString.valueOf(Object)を介してStringに変換され、", "で区切られます。配列がnullの場合、"null"が返されます。

6
quietmint

「私は一番短い」チャレンジのために、ここに鉱山があります;)

反復:

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)));
}
5
sp00m

これが私のやり方です。

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();
}
4

私が知っているものは何も組み込まれていません。

Apache Commons Lang には StringUtils というクラスがあり、多くの結合関数が含まれています。

4
JonMR

私のスピン。

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, "");
}
2
Jackson

同様の代替

/**
 * @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();
}
2
William Simpson

Stringクラスのメソッドのみを使用する私の3行の方法が好きですか?

static String join(String glue, String[] array) {
    String line = "";
    for (String s : array) line += s + glue;
    return (array.length == 0) ? line : line.substring(0, line.length() - glue.length());
}
1
Ryoichiro Oka

「str1」、「str2」、「」から「str1、str2」を取得するには:

Stream.of("str1", "str2", "").filter(str -> !str.isEmpty()).collect(Collectors.joining(", ")); 

また、ヌルチェックを追加することもできます

0
ema

Functional Javaライブラリを使用しており、何らかの理由でJava 8からのストリームを使用できない場合(Android + Retrolambdaを使用している場合があります)プラグイン)、ここにあなたのための機能的なソリューションがあります:

String joinWithSeparator(List<String> items, String separator) {
    return items
            .bind(id -> list(separator, id))
            .drop(1)
            .foldLeft(
                    (result, item) -> result + item,
                    ""
            );
}

これは最も効率的なアプローチではありませんが、小さなリストには適しています。

0
Dmitry Zaytsev