一个反转 java String.split()效果的方法?

我正在寻找一个方法,以结合一个字符串数组成一个分隔 与 split ()相对的字符串。

在我尝试编写自己的文章之前,我想先问问论坛(因为 JDK 什么都有)

147424 次浏览

据我所知,JDK 中没有这样的方法。Apache Commons LangStringUtils类中有各种重载的 join()方法,它们可以做你想做的事情。

DZone 片段上有几个示例,如果您想要使用 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();
}

我得到了下面的例子 给你

/*
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" }, "$#$"));
}
}

Google 还在他们的 Google 收藏库中提供了一个细木工类:

乔纳空气污染指数

谷歌收藏

基于之前所有的答案:

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

我更喜欢这个:

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,但是这段代码更具可读性)。

您可以将此功能从 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("[\\[\\]]", "");

如果您有一个 int [] ,那么 Arrays.toString()是最简单的方法。

这个也不错:

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

我写了这个:

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, ", ")}

至少从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

下面是新的 JDK 8 StringJoiner 在 String 数组上的示例

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

适用于 Android: in 文本,文本工具 方法有:

public static String join (CharSequence delimiter, Iterable tokens)
public static String join (CharSequence delimiter, Object[] tokens)

返回一个字符串,该字符串包含由分隔符联接的标记。

令牌——一个要连接的数组对象。字符串将通过调用 object.toString ()从这些对象形成。

为了完整起见,我想补充一点,通常不能反转 字符串 # 分裂,因为它接受正则表达式。

产生 ["hello", "world"]
产生 ["hello", "world"]

这些从不同的起点产生相同的结果。分裂不是一对一的操作,因此是不可逆的。

这就是说,如果您假设您的参数是一个固定的字符串,而不是正则表达式,那么您当然可以使用许多公布的答案之一来完成此操作。

如果您使用 jdk8,请参阅@Nathaniel Johnson 的 回答,因为这样更好。

我认为这里的许多答案是复杂的或不容易阅读。分支预测如此高效,为什么不使用 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也是这样做的,只不过是在单独的方法调用中,而不是简单的循环。

下面的代码给出了一个基本的想法。

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

自从 JDK8以来,我非常喜欢 Streams 和 Lambdas,所以我建议:

public static String join( String delimiter, String[] array )
{
return Arrays.asList( array ).stream().collect( Collectors.joining( delimiter ) );
}