我经常在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设计)?
答案 0 :(得分:79)
如果您不需要过滤任何可以使用的元素
String.join(CharSequence delimiter, CharSequence...
elements)
String.join(" > ", new String[]{"foo", "bar"});
String.join(" > ", "foo", "bar");
或String.join(CharSequence delimiter, Iterable<? extends CharSequence>
elements)
String.join(" > ", Arrays.asList("foo", "bar"));
从Java 8开始,我们可以使用StringJoiner
(而不是最初使用的StringBulder
)并简化我们的代码。
另外,为了避免在" *"
的每次调用中重新编译matches(" *")
正则表达式,我们可以创建单独的Pattern,它将在某些字段中保存其编译版本并在需要时使用它。
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
个元素。在这种情况下,我们希望谓词接受不仅是空格的字符串 - 换句话说,字符串必须包含非空白字符。
我们可以从Pattern创建这样的谓词。以这种方式创建的谓词将接受任何包含可以由正则表达式匹配的子字符串的字符串(因此,如果正则表达式将查找"\\S"
谓词将接受"foo "
," foo bar "
,{{1}等字符串}},但不接受"whatever"
或" "
)。
所以我们可以使用
" "
或者可能只是更具描述性,否定仅为空格的字符串,或为空
Pattern.compile("\\S").asPredicate();
接下来,当过滤器将删除所有空格或仅包含空格字符串时,我们可以Pattern.compile("^\\s*$").asPredicate().negate();
其余元素。感谢collect
我们可以决定使用哪个分隔符。
Collectors.joining
您可以像
一样使用它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" }));
答案 1 :(得分:78)
为什么这么认真?
试试StringUtils.join(new String[] {"Hello", "World", "!"}, ", ")
!
答案 2 :(得分: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));
答案 3 :(得分:15)
以下是针对某些
的Android特定答案String combined = TextUtils.join(",", new String[]{"Red", "Green", "Blue"});
//Result => Red,Green,Blue
请务必导入TextUtils类
import android.text.TextUtils;
答案 4 :(得分: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;
}
你可以为它创建重载..
以上它相当于php implode 这是你想要的:
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;
}
答案 5 :(得分:2)
使用Streams(对于Java 8及更高版本)将是另一种可能的解决方案。 您需要导入
java.util.stream.Collectors;
使用加入流程
您可以使用:
Arrays.asList("foo","bar").stream().collect(Collectors.joining(","));
以达到理想的效果。
答案 6 :(得分:1)
这是我的内幕实施:
/**
* 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();
}
答案 7 :(得分: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();
}
答案 8 :(得分: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"