Java函数的数组,如PHP's join()?

我想用胶水字符串连接String[]。有这个函数吗?

128661 次浏览

Java8开始,可以使用String.join()

String.join(", ", new String[]{"Hello", "World", "!"})

生成:

Hello, World, !

否则,Apache Commons Lang有一个StringUtils类,该类有一个join函数,该函数将数组连接在一起以形成String

例如:

StringUtils.join(new String[] {"Hello", "World", "!"}, ", ")

生成以下String:

Hello, World, !

不是在核心,不是。搜索“java array join string glue”会给你一些关于如何实现这一点的代码片段。

如。

public static String join(Collection s, String delimiter) {
StringBuffer buffer = new StringBuffer();
Iterator iter = s.iterator();
while (iter.hasNext()) {
buffer.append(iter.next());
if (iter.hasNext()) {
buffer.append(delimiter);
}
}
return buffer.toString();
}

据我所知,没有内置的。

Apache Commons Lang有一个名为StringUtils的类,它包含许多连接函数。

你可以很容易地在大约十行代码中编写这样一个函数:

String combine(String[] s, String glue)
{
int k = s.length;
if ( k == 0 )
{
return null;
}
StringBuilder out = new StringBuilder();
out.append( s[0] );
for ( int x=1; x < k; ++x )
{
out.append(glue).append(s[x]);
}
return out.toString();
}

arrays有一个“asList”方法。与java.util一起使用。列表/数组列表API,这给了你所有你需要的:

private static String[] join(String[] array1, String[] array2) {


List<String> list = new ArrayList<String>(Arrays.asList(array1));
list.addAll(Arrays.asList(array2));
return list.toArray(new String[0]);
}

我就是这么做的。

private String join(String[] input, String delimiter)
{
StringBuilder sb = new StringBuilder();
for(String value : input)
{
sb.append(value);
sb.append(delimiter);
}
int length = sb.length();
if(length > 0)
{
// Remove the extra delimiter
sb.setLength(length - delimiter.length());
}
return sb.toString();
}

考虑到:

String[] a = new String[] { "Hello", "World", "!" };

然后,作为coobird的答案的替代方案,胶水是“,”:

Arrays.asList(a).toString().replaceAll("^\\[|\\]$", "")

或者连接不同的字符串,例如“&”".

Arrays.asList(a).toString().replaceAll(", ", " &amp; ").replaceAll("^\\[|\\]$", "")

然而……只有当你知道数组或列表中的值不包含字符串“,”时,这个方法才有效。

用一个小mod代替substring():

//join(String array,delimiter)
public static String join(String r[],String d)
{
if (r.length == 0) return "";
StringBuilder sb = new StringBuilder();
int i;
for(i=0;i<r.length-1;i++){
sb.append(r[i]);
sb.append(d);
}
sb.append(r[i]);
return sb.toString();
}

谷歌guava的库也有这种能力。你也可以从API中看到String[]的例子。

正如api中已经描述的,要注意构建器方法的不可变性。

它可以接受一个对象数组,所以它在你的情况下是可行的。在我以前的经验中,我尝试加入一个堆栈,这是一个可迭代的,它工作得很好。

我的例子:

Deque<String> nameStack = new ArrayDeque<>();
nameStack.push("a coder");
nameStack.push("i am");
System.out.println("|" + Joiner.on(' ').skipNulls().join(nameStack) + "|");

打印出:|i am a coder|

如果你正在使用Spring框架,那么你有stringutil类:

import static org.springframework.util.StringUtils.arrayToDelimitedString;


arrayToDelimitedString(new String[] {"A", "B", "C"}, "\n");

如果你在这里寻找一个快速的数组到字符串转换,请尝试< >强Arrays.toString() < / >强

创建传入Object[]的String表示形式。结果是 用括号括起来("[]"),每个元素都被转换为字符串 通过String.valueOf(Object)", "分开。如果数组是

. null,则返回"null"

类似的替代方案

/**
* @param delimiter
* @param inStr
* @return String
*/
public static String join(String delimiter, String... inStr)
{
StringBuilder sb = new StringBuilder();
if (inStr.length > 0)
{
sb.append(inStr[0]);
for (int i = 1; i < inStr.length; i++)
{
sb.append(delimiter);
sb.append(inStr[i]);
}
}
return sb.toString();
}

如果你正在寻找在android中使用什么,它是:

String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens)

例如:

String joined = TextUtils.join(";", MyStringArray);

我使用StringBuilder这样做:

public static String join(String[] source, String delimiter) {
if ((null == source) || (source.length < 1)) {
return "";
}


StringBuilder stringbuilder = new StringBuilder();
for (String s : source) {
stringbuilder.append(s + delimiter);
}
return stringbuilder.toString();
} // join((String[], String)

有一个简单的速记技巧,我大多数时候使用。

String op = new String;
for (int i : is)
{
op += candidatesArr[i-1]+",";
}
op = op.substring(0, op.length()-1);

只是为了"我的最短"挑战,这里有地雷;)

迭代:

public static String join(String s, Object... a) {
StringBuilder o = new StringBuilder();
for (Iterator<Object> i = Arrays.asList(a).iterator(); i.hasNext();)
o.append(i.next()).append(i.hasNext() ? s : "");
return o.toString();
}

递归:

public static String join(String s, Object... a) {
return a.length == 0 ? "" : a[0] + (a.length == 1 ? "" : s + join(s, Arrays.copyOfRange(a, 1, a.length)));
}

你喜欢我只用String类方法的3行方式吗?

static String join(String glue, String[] array) {
String line = "";
for (String s : array) line += s + glue;
return (array.length == 0) ? line : line.substring(0, line.length() - glue.length());
}

在Java 8中你可以使用

1)流API:

String[] a = new String[] {"a", "b", "c"};
String result = Arrays.stream(a).collect(Collectors.joining(", "));

2) new String。join方法:https://stackoverflow.com/a/21756398/466677

3) java.util.StringJoiner类:http://docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html

我的自旋。

public static String join(Object[] objects, String delimiter) {
if (objects.length == 0) {
return "";
}
int capacityGuess = (objects.length * objects[0].toString().length())
+ ((objects.length - 1) * delimiter.length());
StringBuilder ret = new StringBuilder(capacityGuess);
ret.append(objects[0]);
for (int i = 1; i < objects.length; i++) {
ret.append(delimiter);
ret.append(objects[i]);
}
return ret.toString();
}


public static String join(Object... objects) {
return join(objects, "");
}

就像最近的许多问题一样,Java 8来拯救:


Java 8在java.lang.String中添加了一个新的静态方法,这正是你想要的:

public static String join(CharSequence delimeter, CharSequence... elements);

使用它:

String s = String.join(", ", new String[] {"Hello", "World", "!"});

结果:

"Hello, World, !"

从“str1”,“str2”,“”中获取“str1, str2”:

Stream.of("str1", "str2", "").filter(str -> !str.isEmpty()).collect(Collectors.joining(", "));

此外,您还可以添加额外的空检查

如果你正在使用函数式Java库,并且由于某种原因不能使用Java 8中的流(当使用Android + Retrolambda插件时可能会出现这种情况),这里有一个函数式解决方案:

String joinWithSeparator(List<String> items, String separator) {
return items
.bind(id -> list(separator, id))
.drop(1)
.foldLeft(
(result, item) -> result + item,
""
);
}

注意,这不是最有效的方法,但它确实适用于小列表。

无论选择哪种方法,都要注意数组中的空值。它们的字符串表示是"null"因此,如果这不是您想要的行为,跳过null元素。

String[] parts = {"Hello", "World", null, "!"};
Stream.of(parts)
.filter(Objects::nonNull)
.collect(Collectors.joining(" "));

如前所述,自Java 8以来,类StringJoiner也是一个可用的选项:

@NotNull
String stringArrayToCsv(@NotNull String[] data) {
if (data.length == 0) {return "";}
StringJoiner joiner = new StringJoiner(", ");
Iterator<String> itr = Arrays.stream(data).iterator();
while (itr.hasNext()) {joiner.add(itr.next());}
return joiner.toString();
}

然而,传统的String.join()更少的导入和代码:

@NotNull
String stringArrayToCsv(@NotNull String[] data) {
if (data.length == 0) {return "";}
return String.join(", ", data);
}