web-dev-qa-db-ja.com

Java PHPのimplode( '、'、array_filter(array()))と同等

私は頻繁にこのコードを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"

Java 外部ライブラリを追加する必要なし(Android用の設計)での最良のJava実装(コードが少ない))は何ですか?

67
max4ever

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要素を使用できます。この場合、述語はスペースだけではない文字列を受け入れます-言い換えれば、文字列は非空白文字を含まなければなりません。

このようなPredicateをPatternから作成できます。この方法で作成された述語は、正規表現と一致する可能性がある部分文字列を含むすべての文字列を受け入れます(したがって、正規表現が"\\S"を探す場合、述語は"foo "" foo bar ""whatever"、ただし" "" "も受け入れません。

だから我々は使用することができます

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

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

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

次に、フィルターがすべての空の文字列またはスペースのみを含む文字列を削除すると、残りの要素を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

80
Pshemo

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

78
Bogdan Burim

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));
17
nickb

ここにAndroid特定の回答があります。

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

//Result => Red,Green,Blue

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

import Android.text.TextUtils;
16
dloomb

Streams(for Java 8以降)を使用することは、この代替ソリューションの可能性があります。インポートする必要があります

Java.util.stream.Collectors;

結合プロセスを使用するには

以下を使用できます。

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

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

2
Aman J

シンプルな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;
}

オーバーロードを作成できます。

上記のphpに相当するものは破裂します。
あなたが望むものは次のとおりです。

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;
}
2
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();
    }
1
Ahmad

これが私の実装の実装です。

/**
 * 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();
}
1
Ben Barkay

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

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"
0
Ferhad Konar