我正在寻找一种方法将字符串数组合成一个分隔符 串。与split()相反。
在我尝试编写自己的论坛之前想要问论坛(因为JDK拥有一切)
答案 0 :(得分:91)
我知道JDK中没有这方法。 Apache Commons Lang在StringUtils
类中有各种重载的join()
方法,可以执行您想要的操作。
答案 1 :(得分:40)
至少从2009年开始就有一个开放的功能请求。它的长短之处在于它将成为JDK 8的java.util.StringJoiner类的部分功能。 http://download.java.net/lambda/b81/docs/api/java/util/StringJoiner.html
如果您有兴趣,这是Oracle问题。 http://bugs.sun.com/view_bug.do?bug_id=5015163
以下是String
数组中新JDK 8 StringJoiner的示例String[] a = new String[]{"first","second","third"};
StringJoiner sj = new StringJoiner(",");
for(String s:a) sj.add(s);
System.out.println(sj); //first,second,third
String中的实用程序方法使这更简单:
String s = String.join(",", stringArray);
答案 2 :(得分:22)
您可以将此功能从Arrays
实用程序包中隐藏。
import java.util.Arrays;
...
String delim = ":",
csv_record = "Field0:Field1:Field2",
fields[] = csv_record.split(delim);
String rebuilt_record = Arrays.toString(fields).replace(", ", delim).replaceAll("[\\[\\]]", "");
答案 3 :(得分:16)
我得到了以下示例here
/*
7) Join Strings using separator >>>AB$#$CD$#$EF
*/
import org.apache.commons.lang.StringUtils;
public class StringUtilsTrial {
public static void main(String[] args) {
// Join all Strings in the Array into a Single String, separated by $#$
System.out.println("7) Join Strings using separator >>>"
+ StringUtils.join(new String[] { "AB", "CD", "EF" }, "$#$"));
}
}
答案 4 :(得分:12)
答案 5 :(得分:10)
DZone Snippets上有几个例子,如果你想推广自己适用于Collection的。例如:
public static String join(AbstractCollection<String> s, String delimiter) {
if (s == null || s.isEmpty()) return "";
Iterator<String> iter = s.iterator();
StringBuilder builder = new StringBuilder(iter.next());
while( iter.hasNext() )
{
builder.append(delimiter).append(iter.next());
}
return builder.toString();
}
答案 6 :(得分:7)
如果你有一个int [],Arrays.toString()
是最简单的方法。
答案 7 :(得分:4)
基于之前的所有答案:
public static String join(Iterable<? extends Object> elements, CharSequence separator)
{
StringBuilder builder = new StringBuilder();
if (elements != null)
{
Iterator<? extends Object> iter = elements.iterator();
if(iter.hasNext())
{
builder.append( String.valueOf( iter.next() ) );
while(iter.hasNext())
{
builder
.append( separator )
.append( String.valueOf( iter.next() ) );
}
}
}
return builder.toString();
}
答案 8 :(得分:3)
对于Android:in android.text.TextUtils 有方法:
public static String join (CharSequence delimiter, Iterable tokens)
public static String join (CharSequence delimiter, Object[] tokens)
返回包含由分隔符连接的标记的字符串。
标记 - 要连接的数组对象。将通过调用object.toString()。
从对象形成字符串答案 9 :(得分:1)
这个也不错:
public static String join(String delimitor,String ... subkeys) {
String result = null;
if(null!=subkeys && subkeys.length>0) {
StringBuffer joinBuffer = new StringBuffer(subkeys[0]);
for(int idx=1;idx<subkeys.length;idx++) {
joinBuffer.append(delimitor).append(subkeys[idx]);
}
result = joinBuffer.toString();
}
return result;
}
答案 10 :(得分:1)
我写了这个:
public static String join(Collection<String> col, String delim) {
StringBuilder sb = new StringBuilder();
Iterator<String> iter = col.iterator();
if (iter.hasNext())
sb.append(iter.next());
while (iter.hasNext()) {
sb.append(delim);
sb.append(iter.next());
}
return sb.toString();
}
JSP不支持 Collection
,因此对于TLD,我写道:
public static String join(List<?> list, String delim) {
int len = list.size();
if (len == 0)
return "";
StringBuilder sb = new StringBuilder(list.get(0).toString());
for (int i = 1; i < len; i++) {
sb.append(delim);
sb.append(list.get(i).toString());
}
return sb.toString();
}
并放入.tld
文件:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
<function>
<name>join</name>
<function-class>com.core.util.ReportUtil</function-class>
<function-signature>java.lang.String join(java.util.List, java.lang.String)</function-signature>
</function>
</taglib>
并在JSP文件中将其用作:
<%@taglib prefix="funnyFmt" uri="tag:com.core.util,2013:funnyFmt"%>
${funnyFmt:join(books, ", ")}
答案 11 :(得分:1)
为了完整起见,我想补充一点,你不能反转String#split,因为它接受正则表达式。
"hello__world".split("_+");
收益["hello", "world"]
"hello_world".split("_+");
收益["hello", "world"]
。
从不同的起点得到相同的结果。分裂不是一对一的操作,因此是不可逆的。
这就是说,如果你假设你的参数是一个固定的字符串,而不是正则表达式,那么你当然可以使用许多发布的答案之一来做到这一点。
答案 12 :(得分:1)
下面的代码给出了一个基本的想法。这不是最佳解决方案。
public static String splitJoin(String sourceStr, String delim,boolean trim,boolean ignoreEmpty){
return join(Arrays.asList(sourceStr.split(delim)), delim, ignoreEmpty);
}
public static String join(List<?> list, String delim, boolean ignoreEmpty) {
int len = list.size();
if (len == 0)
return "";
StringBuilder sb = new StringBuilder(list.get(0).toString());
for (int i = 1; i < len; i++) {
if (ignoreEmpty && !StringUtils.isBlank(list.get(i).toString())) {
sb.append(delim);
sb.append(list.get(i).toString().trim());
}
}
return sb.toString();
}
答案 13 :(得分:1)
自JDK8以来,我非常喜欢Streams和Lambdas,所以我建议:
public static String join( String delimiter, String[] array )
{
return Arrays.asList( array ).stream().collect( Collectors.joining( delimiter ) );
}
答案 14 :(得分:0)
我更喜欢这个:
public String join(Collection<String> strCollection, String delimiter) {
String joined = "";
int noOfItems = 0;
for (String item : strCollection) {
joined += item;
if (++noOfItems < strCollection.size())
joined += delimiter;
}
return joined;
}
这是迄今为止我找到的最好的解决方案。 (不要担心使用原始String对象而不是StringBuilder。现代Java编译器无论如何都使用StringBuilder,但这段代码更具可读性。)
答案 15 :(得分:0)
如果您使用jdk8,请参阅@Nathaniel Johnson的answer,因为这样会更好。
我认为这里的许多答案都很复杂或不易阅读。使用分支预测非常有效,为什么你不使用if语句?
public static String join(List<String> fooList){
if (fooList.isEmpty()) return "";
StringBuilder sb = null;
for (String element : fooList) {
if (sb == null) {
sb = new StringBuilder();
} else {
sb.append(", ");
}
sb.append(element);
}
return sb.toString();
}
应该提到的一点是,Apache使用一个简单的for循环,其中的if语句就像这样(它使用数组作为索引来知道第一个元素),而openjdk 8也是如此,但在分离的方法调用中而不是一个简单的循环。