我想用胶水字符串加入String[]
。这有功能吗?
答案 0 :(得分:307)
从 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, !
答案 1 :(得分:71)
如果您正在寻找在Android中使用的内容,那就是:
String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens)
例如:
String joined = TextUtils.join(";", MyStringArray);
答案 2 :(得分:55)
在Java 8中,您可以使用
1)Stream API:
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
答案 3 :(得分:52)
您可以在大约十行代码中轻松编写这样的函数:
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();
}
答案 4 :(得分:25)
一个小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();
}
答案 5 :(得分:18)
与最近的许多问题一样,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, !"
答案 6 :(得分:14)
Google guava的图书馆也有this kind of capability。您也可以从API中看到String []示例。
如api中所述,请注意构建器方法的不变性。
它可以接受一个对象数组,因此它可以在你的情况下工作。在我以前的经验中,我尝试加入一个可迭代的Stack,它工作正常。
来自我的样本:
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|
答案 7 :(得分:9)
假设:
String[] a = new String[] { "Hello", "World", "!" };
然后作为coobird答案的替代方案,胶水是“,”:
Arrays.asList(a).toString().replaceAll("^\\[|\\]$", "")
或者用不同的字符串连接,例如“&amp; amp;”。
Arrays.asList(a).toString().replaceAll(", ", " & ").replaceAll("^\\[|\\]$", "")
然而......只有当你知道数组或列表中的值不包含字符串“,”时,这个才有效。
答案 8 :(得分:9)
如果您使用Spring Framework,那么您拥有StringUtils类:
import static org.springframework.util.StringUtils.arrayToDelimitedString;
arrayToDelimitedString(new String[] {"A", "B", "C"}, "\n");
答案 9 :(得分:8)
不是核心,不是。搜索“java array join string glue”会给你一些关于如何实现这个目标的代码片段。
e.g。
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();
}
答案 10 :(得分:6)
如果您已在此处寻找快速的数据到字符串转换,请尝试Arrays.toString()。
创建传递的
Object[]
的String表示形式。结果是 括号("[]"
)包围,每个元素都转换为String 通过String.valueOf(Object)
并以", "
分隔。如果数组是null
,然后返回"null"
。
答案 11 :(得分:5)
仅仅为“我是最短的”挑战,这里是地雷;)
<强>迭代:强>
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)));
}
答案 12 :(得分:4)
我所知道的没有任何内置。
Apache Commons Lang有一个名为StringUtils
的类,其中包含许多连接函数。
答案 13 :(得分:4)
我就是这样做的。
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();
}
答案 14 :(得分:2)
类似的替代
/**
* @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();
}
答案 15 :(得分:2)
我的旋转。
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, "");
}
答案 16 :(得分:1)
你喜欢我使用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());
}
答案 17 :(得分:0)
从“str1”,“str2”,“”获取“str1,str2”:
pom.xml
您还可以添加额外的空检查
答案 18 :(得分:0)
如果您使用的是功能性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,
""
);
}
请注意,这不是最有效的方法,但它确实适用于小型列表。
答案 19 :(得分:-1)
我是这样使用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)
答案 20 :(得分:-2)
我大部分时间都使用简单的速记技术..
String op = new String;
for (int i : is)
{
op += candidatesArr[i-1]+",";
}
op = op.substring(0, op.length()-1);
答案 21 :(得分:-3)
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]);
}