Java:数组的function像PHP的join()?

我想用一个胶水stringjoin一个String[] 。 有这个function吗?

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, ! 

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

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

例如:

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

在Java 8中,您可以使用

1)streamAPI:

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

2)新的String.join方法: https ://stackoverflow.com/a/21756398/466677

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

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

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

一个小模块,而不是使用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(); } 

就像最近许多问题一样,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, !" 

Google番石榴的图书馆也有这种能力 。 您也可以从API中看到String []示例。

正如在api中所描述的那样,要小心build设者方法的不变性。

它可以接受一个对象的数组,所以它会在你的情况下工作。 在我以前的经验,我试图join一个堆栈是一个迭代,它工作正常。

来自我的样本:

 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|

鉴于:

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

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

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

或与不同的string连接,如“&amp;”。

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

但是,只有当您知道数组或列表中的值不包含string“,”时,此函数才有效。

如果你使用的是Spring框架,那么你有StringUtils类:

 import static org.springframework.util.StringUtils.arrayToDelimitedString; arrayToDelimitedString(new String[] {"A", "B", "C"}, "\n"); 

不在核心,没有。 search“java数组连接string粘连”将给你一些代码片断,但如何实现这一点。

例如

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

如果您在此处着手寻找快速的数组到string转换,请尝试Arrays.toString()

创build传递的Object[]的string表示forms。 结果被括号( "[]" )包围,每个元素通过String.valueOf(Object)转换为一个String,并用", "分隔。 如果数组为null ,则返回"null"

只是“我有最短的一个”的挑战,这里是地雷;)

迭代:

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

recursion:

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

没有什么内置的,我知道的。

Apache Commons Lang有一个名为StringUtils的类,它包含许多StringUtilsfunction。

这是我如何做到的。

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

一个类似的select

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

我的旋转。

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

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

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

要从“str1”,“str2”,“”中获得“str1,str2”:

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

您也可以添加额外的空检查

如果您使用Functional Java库,并且出于某种原因无法使用Java 8中的Streams(使用Android + Retrolambda插件时可能会出现这种情况),以下是适用于您的function性解决scheme:

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

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

我这样做使用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); 

java.util.Arrays有一个“asList”方法。 结合java.util.List / ArrayList 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]); }