我想用一个粘合字符串(glue string)连接一个String[]
数组,有没有相关的函数可以实现这个目的?
我想用一个粘合字符串(glue string)连接一个String[]
数组,有没有相关的函数可以实现这个目的?
为了应对“我拥有最短的代码”的挑战,这里是我的代码;)
迭代法:
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)));
}
copyOfRange()
”)。 - Ogre Psalm33这是我的做法。
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();
}
/**
* @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, "");
}
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());
}
StringBuilder
:P - Ryoichiro Oka如果你正在使用Functional Java库,但由于某些原因无法使用Java 8的Streams(当使用Android + Retrolambda插件时可能会出现这种情况),那么这里有一个功能性的解决方案:
String joinWithSeparator(List<String> items, String separator) {
return items
.bind(id -> list(separator, id))
.drop(1)
.foldLeft(
(result, item) -> result + item,
""
);
}
如前所述,自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);
}
String[] parts = {"Hello", "World", null, "!"};
Stream.of(parts)
.filter(Objects::nonNull)
.collect(Collectors.joining(" "));