81

私はこのコードをPHPでよく使用します

$ordine['address'] = implode(', ', array_filter(array($cliente['cap'], $cliente['citta'], $cliente['provincia'])));

空の文字列をクリアし、それらを「、」で結合します。1つだけ残っている場合は、不要なコンマは追加されません。最後にコンマは追加されません。何も残っていない場合は、空の文字列を返します。

したがって、次のいずれかの結果を得ることができます

""
"Street abc 14"
"Street abc 14, 00168"
"Street abc 14, 00168, Rome"

外部ライブラリ(Android用に設計)を追加せずにJavaで最高のJava実装(コードが少ない)は何ですか?

4

9 に答える 9

95

Java 8を使用して更新されたバージョン(投稿の最後にあるオリジナル)

使用できる要素をフィルタリングする必要がない場合


Java 8以降StringJoiner、(最初に使用されたのではなくStringBulder)コードを使用して簡略化できます。
また、" *"の呼び出しごとに正規表現が再コンパイルされないようにするためmatches(" *")に、コンパイルされたバージョンを一部のフィールドに保持し、必要に応じて使用する個別のパターンを作成できます。

private static final Pattern SPACES_OR_EMPTY = Pattern.compile(" *");
public static String implode(String separator, String... data) {
    StringJoiner sb = new StringJoiner(separator);
    for (String token : data) {
        if (!SPACES_OR_EMPTY.matcher(token).matches()) {
            sb.add(token);
        }
    }
    return sb.toString();
}   

ストリームを使用すると、コードは次のようになります。

private static final Predicate<String> IS_NOT_SPACES_ONLY = 
        Pattern.compile("^\\s*$").asPredicate().negate();

public static String implode(String delimiter, String... data) {
    return Arrays.stream(data)
            .filter(IS_NOT_SPACES_ONLY)
            .collect(Collectors.joining(delimiter));
}

ストリームを使用する場合、filter要素を使用できますPredicate。この場合、述語がスペースだけではない文字列を受け入れるようにします。つまり、文字列には空白以外の文字が含まれている必要があります。

パターンからそのような述語を作成することができます。この方法で作成された述語は、正規表現と一致する可能性のあるサブ文字列を含むすべての文字列を受け入れます(したがって、正規表現が"\\S"述語を検索する場合、、、、など"foo "の文字列を受け入れますが、" foo bar "または"whatever"を受け入れ" "ません" ")。

だから私たちは使うことができます

Pattern.compile("\\S").asPredicate();

または、おそらくもう少し説明的な、スペースのみの文字列の否定、または空の文字列

Pattern.compile("^\\s*$").asPredicate().negate();

次に、filterがすべての空の、またはスペースのみを含む文字列を削除するときに、collect残りの要素を削除できます。おかげでCollectors.joining、使用する区切り文字を決定できます。


元の回答(Java 8より前)

public static String implode(String separator, String... data) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < data.length - 1; i++) {
    //data.length - 1 => to not add separator at the end
        if (!data[i].matches(" *")) {//empty string are ""; " "; "  "; and so on
            sb.append(data[i]);
            sb.append(separator);
        }
    }
    sb.append(data[data.length - 1].trim());
    return sb.toString();
}

あなたはそれを次のように使うことができます

System.out.println(implode(", ", "ab", " ", "abs"));

また

System.out.println(implode(", ", new String[] { "ab", " ", "abs" }));

出力ab, abs

于 2012-06-28T16:11:24.480 に答える
80

なぜそんなに真剣なんだ?試してみてくださいStringUtils.join(new String[] {"Hello", "World", "!"}, ", ")

于 2013-01-29T14:10:55.840 に答える
20

これは、一部の人に役立つ可能性のあるAndroid固有の回答です。

String combined = TextUtils.join(",", new String[]{"Red", "Green", "Blue"});

// Result => Red,Green,Blue

必ずTextUtilsクラスをインポートしてください。

import android.text.TextUtils;
于 2016-01-13T00:59:36.040 に答える
17

文字列をArrayListに追加し、空の文字列を削除して、それに応じてフォーマットする必要があります。

public static String createAddressString( String street, String zip_code, String country) {
    List<String> list = new ArrayList<String>();
    list.add( street);
    list.add( zip_code);
    list.add( country);

    // Remove all empty values
    list.removeAll(Arrays.asList("", null));

    // If this list is empty, it only contained blank values
    if( list.isEmpty()) {
        return "";
    }

    // Format the ArrayList as a string, similar to implode
    StringBuilder builder = new StringBuilder();
    builder.append( list.remove(0));

    for( String s : list) {
        builder.append( ", ");
        builder.append( s);
    }

    return builder.toString();
}

さらに、String[]文字列の配列がある場合は、それらをArrayListに簡単に追加できます。

String[] s;
List<String> list = new ArrayList<String>( Arrays.asList( s));
于 2012-06-28T15:50:30.247 に答える
3

Streams(Java 8以降の場合)を使用することは、これに対する代替の可能な解決策です。

インポートする必要があります

java.util.stream.Collectors;

参加プロセスを使用するには

あなたは使用することができます:

Arrays.asList("foo","bar").stream().collect(Collectors.joining(","));

望ましい結果を達成するために。

于 2017-02-18T12:17:27.490 に答える
2

シンプルなImplode

public static String implode(String glue, String[] strArray)
{
    String ret = "";
    for(int i=0;i<strArray.length;i++)
    {
        ret += (i == strArray.length - 1) ? strArray[i] : strArray[i] + glue;
    }
    return ret;
}

あなたはそれのためにオーバーロードを作成することができます。

上記はphpimplodeに相当します。
これがあなたが望むものです:

import java.lang.*
public static String customImplode(String glue, String[] strArray)
{
    String ret = "";
    for(int i=0;i<strArray.length;i++)
    {
        if (strArray[i].trim() != "")
            ret += (i == strArray.length - 1) ? strArray[i] : strArray[i] + glue;
    }
    return ret;
}
于 2012-06-28T15:47:25.380 に答える
1

これが私のimplodeの実装です:

/**
 * Implodes the specified items, gluing them using the specified glue replacing nulls with the specified
 * null placeholder.
 * @param glue              The text to use between the specified items.
 * @param nullPlaceholder   The placeholder to use for items that are <code>null</code> value.
 * @param items             The items to implode.
 * @return  A <code>String</code> containing the items in their order, separated by the specified glue.
 */
public static final String implode(String glue, String nullPlaceholder, String ... items) {
    StringBuilder sb = new StringBuilder();
    for (String item : items) {
        if (item != null) {
            sb.append(item);
        } else {
            sb.append(nullPlaceholder);
        }
        sb.append(glue);
    }
    return sb.delete(sb.length() - glue.length(), sb.length()).toString();
}
于 2013-11-02T12:49:04.923 に答える
1
public static String implode(List<String> items, String separator) {

        if (items == null || items.isEmpty()) {
            return null;
        }
        String delimiter = "";
        StringBuilder builder = new StringBuilder();
        for (String item : items) {
            builder.append(delimiter).append(item);
            delimiter = separator;
        }
        return builder.toString();
    }
于 2016-03-28T01:41:56.960 に答える
0

この単純な関数を使用します。

private String my_implode(String spacer, String[] in_array){

    String res = "";

    for (int i = 0 ; i < in_array.length ; i++) {

        if (!res.equals("")) {
            res += spacer;
        }
        res += in_array[i];
    }

    return res;
}

使用する:

data_arr = {"d1", "d2", "d3"};
your_imploded_text = my_implode(",", data_arr);
// Output: your_imploded_text = "d1,d2,d3"
于 2015-10-26T08:56:39.487 に答える