Java与PHP的等价物';s内爆(';,';,数组过滤器(数组())

Java与PHP的等价物';s内爆(';,';,数组过滤器(数组()),java,php,Java,Php,我经常在PHP中使用这段代码 $ordine['address'] = implode(', ', array_filter(array($cliente['cap'], $cliente['citta'], $cliente['provincia']))); 它清除空字符串并用“,”连接它们。如果只剩下一个逗号,就不会添加多余的逗号。它不会在结尾添加逗号。如果没有剩余值,则返回空字符串 因此,我可以得到以下结果之一 "" "Street abc 14"

我经常在PHP中使用这段代码

$ordine['address'] = implode(', ', array_filter(array($cliente['cap'], $cliente['citta'], $cliente['provincia'])));
它清除空字符串并用“,”连接它们。如果只剩下一个逗号,就不会添加多余的逗号。它不会在结尾添加逗号。如果没有剩余值,则返回空字符串

因此,我可以得到以下结果之一

""
"Street abc 14"
"Street abc 14, 00168"
"Street abc 14, 00168, Rome"
什么是Java中最好的Java实现(代码更少),而不必添加外部库(为Android设计)?

一个简单的内爆

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;
}
publicstaticstring内爆(stringglue,String[]strArray)
{
字符串ret=“”;

对于(int i=0;i,您必须将字符串添加到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();
}
使用Java8更新的版本(原文在文章末尾) 如果不需要过滤任何可以使用的元素

    • String.join(“>”,新字符串[]{“foo”,“bar”});
    • String.join(“>”、“foo”、“bar”);


    • String.join(“>”,array.asList(“foo”,“bar”);

由于Java 8,我们可以使用
StringJoiner
(而不是最初使用的
StringBulder
)并简化代码。
另外,为了避免在每次调用
匹配项(“*”)时重新编译
“*”
正则表达式,我们可以创建单独的模式,将编译后的版本保存在某些字段中,并在需要时使用它

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));
}
或者可能更具描述性,对仅为空格或空的字符串求反

Pattern.compile("^\\s*$").asPredicate().negate();
接下来,当筛选器将删除所有空字符串或仅包含空格字符串时,我们可以
收集
其余元素。多亏了
收集器。加入
我们可以决定使用哪个分隔符


原始答案(Java8之前) 或

输出
ab,abs

为什么这么严重?
请尝试
StringUtils.join(新字符串[]{“Hello”,“World”,“!”},“,”)

以下是我的内爆实现:

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

使用以下简单功能:

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;
}

以下是一个特定于Android的答案,可能对某些人有所帮助:

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

// Result => Red,Green,Blue
请确保导入TextUtils类:

import android.text.TextUtils;
公共静态字符串内爆(列表项、字符串分隔符){
if(items==null | | items.isEmpty()){
返回null;
}
字符串分隔符=”;
StringBuilder=新的StringBuilder();
用于(字符串项:项){
builder.append(分隔符).append(项);
分隔符=分隔符;
}
返回builder.toString();
}
使用流(for和更高版本)将是解决这一问题的替代方案

您需要导入

java.util.stream.Collectors;
要使用join进程

您可以使用:

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


要获得所需的结果。

FYI对于该示例,您需要一个外部库(import org.apache.commons.lang.StringUtils;)但我仍然建议使用该方法弗里曼不做我需要的事情,不要在需要的地方添加逗号。我不相信java还没有内置逗号。其他所有语言都有。你能改变接受标记吗?这个答案在这里最正确。它在末尾添加了胶水,而且不会跳过空strings@max4ever我认为这是一个很好的例子我们的答案,不是吗?还是没有空strings@max4ever请澄清您的问题。您想要自定义方法或等效的php内爆?!\n您需要添加一个(TextUtils.isEmpty(strArray[i])?“”:strArray[i]+胶水使其工作是的,它使用起来更舒适,因为您不必创建数组,而且我不知道您可以使用字符串,字符串…当数据长度为1xd时,它不工作,我使用这个sb.append(data[0]);for(int i=1;i<(data.length);i++{//data.length-1=>在((数据[i]!=null)和&!数据[i]。匹配项(“*”){//空字符串是“;”;”;等等sb.append(分隔符);sb.append(数据[i]);}}@max4你能举个例子吗?我在
System.out.println(内爆(“,”X”)上测试过
而且它可以很好地工作。StringUtils是一个外部库它是由Apache制作的,每个人都使用它…我按照Bogdan的方式做,你们想做什么就做什么。如果库已经可用,很好,你们是“按自己的方式做”。如果库不可用,a)你们需要知道它是一个外部库b)在哪里/如何获得它,c)是否允许这样做。扮演非公司牛仔只会让你摆脱c)外部库可以在这里找到:在内爆函数的实现中,修改原始列表(错误)并删除ArrayList的第一个元素(costy)。此外,建议从数组进行转换-为什么不只是asList?无论如何,如果输入是一个列表,最干净的方法可能是使用列表的迭代器进行读取(和追加)第一个元素预先循环,然后迭代其余的元素。抱歉,但我必须给你-1。至于删除null和空字符串,你也可以在不修改原始列表的情况下从输出中删除它们-但是你当然需要一个循环来查找第一个非空元素,而不是简单的if。此外,你的解决方案在em上失败pty列表-
删除(0)
抛出一个
IndexOutOfBoundsException
@Vlasec-在我创建自己的本地列表的方法中没有原始列表,因此您的参数无效,因为输入的不是列表,而是三个字符串值。此外,还检查列表是否为空,这是您提供的另一个无效参数。您在技术上是正确的。但是,你仍然应该尝试在这里教授最佳实践。一些新手可能会采用你的技巧,并弄乱现有的列表。此外,即使你可以销毁收藏,这也不是一种特别有效或优雅的方法。@Vlasec-你有权发表你的意见,但我不同意。你的评论是,这不是一种有效或有效的方法t s
/**
 * 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();
}
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"
String combined = TextUtils.join(",", new String[]{"Red", "Green", "Blue"});

// Result => Red,Green,Blue
import android.text.TextUtils;
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();
    }
java.util.stream.Collectors;
Arrays.asList("foo","bar").stream().collect(Collectors.joining(","));