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(", ", " & ").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
的类,它包含许多StringUtils
function。
这是我如何做到的。
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]); }