我想用胶串连接一个String[]。有这个功能吗?
- Java 8的功能包括在框外。我建议读者滚动到@marek gregor的答案(并向上投票)。
- 在爪哇中使用数组分隔符(拆分相反)的快速简便方法
从java8开始,可以使用String.join()。
生成:
否则,ApacheCommonsLang有一个StringUtils类,该类具有join函数,该函数将数组连接在一起以生成String。
例如:
1 2
| StringUtils. join(new String[] {"Hello", "World", "!
<div class="suo -content ">[collapse title=""]<ul><li>为了让搜索这个答案的人受益,应该注意,这也相当于一个Perl连接。</li><li>它说我没有定义</li><li>"1"。commons lang*jar必须在类路径2中。导入org.apache.commons.lang3.stringutils;</li><li>我建议您编辑这个答案,将引用添加到Java 8中介绍的新EDCOX1×0方法。这样,大量阅读这一公认答案的人将受益于这一知识。目前,提到这一事实的投票最高的答案在下面是相当失败的…</li><li>对于Gradle:<wyn>compile 'org.apache.commons:commons-lang3:3.3.2'</wyn>。</li><li>值得一提的是,<wyn>String.join()</wyn>只适用于<wyn>List<CharSequence></wyn>或<wyn>CharSequence[]</wyn>元素。</li><li>也请看下面的Marek Gregor回答,因为它提到了Java流+收集方式:EDCOX1(5)</li></ul>[/collapse]</div><hr><P>如果你想在Android中使用什么,它是:</P>[cc lang="java "]String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens) |
例如:
1
| String joined = TextUtils. join(";", MyStringArray ); |
- 这显然是所有Android版本的最佳答案,因为Java 8只是在Android上推出了一点。这个解决方案使用内置的android libs,而不是这些愚蠢的"包含一个巨大的lib来执行一个操作"解决方案。
- 真周到,谢谢
- 2017年9月,Android的Java 8仍然很遥远。谢谢你的回答!
在Java 8中,您可以使用
1)流API:
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
您可以很容易地用大约十行代码编写这样的函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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();
} |
- 你认为这是一种很好的做法……这类事情没有普遍的标准。
- 幸运的是,有Java。java.sun.com/docs/codeconv
- 是的,一定要用大括号。正因为如此,JAVA才如此美好和舒适!即使Sun并不总是将它们添加到自己的代码示例中。
- 但是如果我包括大括号,那就增加了两行代码,而且我不可能声称在11行中完成了这项工作!
- 问题是,当您过了一段时间后,或者其他人匆匆忙忙地在if/for中添加另一行而不添加大括号时;或者删除if(k==0)后返回空值,在某些情况下,这将编译但不正确。然后,最好为这个右支撑牺牲一条额外的线(如果/对于线,开口可以保持相同)。
- 我们在切线上,但我个人经常忽略括号,因为只有一条线,特别是如果它是一个大的if/elseif/elseif结构,为了紧凑。但是,当有if/else并且其中一个分支需要大括号时,为了对称,我把它放在这两个分支上。我不会担心有人添加一行,也不会意识到他需要添加大括号。如果一个程序员不知道当块中有多行时他需要大括号,我就不相信他有任何线索可以把什么放到块中。
- 我认为这是令人敬畏的,虽然大多数语言把这样的功能打包到他们的核心,Java社区鼓励每个人重新发明方向盘。
- @斯特里克勒:就我个人而言,我更喜欢拥有一套简单但灵活的工具,所以我需要的任何东西都可以轻松构建,而不是一套庞大的复杂工具,所以我需要的任何东西都能准确地弄清楚每种工具的作用,以及如何让它完成我想要的工作。
- 11行?呸!我可以在1中完成!只需删除源文件中的所有换行符。
- @米兰,这就是为什么我通常喜欢在编写代码之前思考,而不是到处乱推语句。增加无用的支撑和不帮助一些白痴模仿工作(主要是做破坏性的工作)都是错误的。
- 在我看来,花时间自己实现它,把它放在某个随机包中,并将其命名为"combine"而不是"join"已经是三个不好的实践了。
- 对于这样一个简单的函数,我宁愿自己花2个小时来编写和调试它,也不愿意花4个小时在Web上搜索其他人编写的代码。""免费代码"并不是真正免费的:你仍然需要花时间搜索它,验证它是否满足你的需要,并找出如何使用它。也不能保证它是无缺陷的。工厂经常争论"制造还是购买":是自己制造还是从别人那里购买更具成本效益?真正的制造商一直在重新发明轮子。世界上有不止一家制造轮子的公司。
- 重新设计车轮可能容易出错。你也不想拖尾,
- 假设逗号在"glue"中,那么上面的代码不会放一个尾随逗号。注意,在下一个标记之前附加了胶水。
- -1用于重新改造车轮
- Java被编译成字节码,所以我们不需要缩小它——使代码尽可能易读和可维护。
- "总而言之,不要重新发明轮子。如果您需要做一些看起来应该是相当常见的事情,那么库中可能已经有了一个类来满足您的需要。如果有,使用它;如果你不知道,检查。一般来说,库代码可能比您自己编写的代码要好,并且可能会随着时间的推移而改进。这不是对你作为程序员能力的反映。规模经济决定了图书馆代码比大多数开发人员所能承担的功能更能吸引相同的功能。"布洛赫,有效Java(第二版)
- 是的,我不会重写已经在标准字符串类中的函数。但我也不会无限的花费时间在网络上寻找解决问题的方法,我可以在一两个小时内自己编写代码。那是"重新发明轮子"吗?我想是这样。就像实体制造商每天重新发明轮子一样。你认为世界上只有一家制造车轮的工厂,其他人都从他们那里购买车轮吗?不?为什么不?因为有时你想要一个与别人不同规格的车轮,…
- …就像儿童玩具卡车的轮子,可能不适合全尺寸卡车。因为有时候自己做轮子比从别人那里买便宜。当然,拥有一个大工厂而不是100个小工厂是有规模经济的。但是总成本中有很多很多因素,而规模只是其中之一。
- @但人类读过。更重要的是,人类写的。除此之外,代码行越少,就越不必到处寻找东西。缩小你的密码,该死的…
- @米兰……或者你可以通过将要执行的一条语句放在与if块相同的行上来保存一行,这样既节省了4:1的空间,又避免了意外脱离这两个构造的风险。
- @Aramkocharyan缩小代码的目的并不是因为这会使可执行文件变小或运行得更快。目的是使阅读更容易。我想有些人会说,即使在不需要大括号的情况下也总是使用大括号,这会使代码更容易阅读,因为它更为一致,而另一些人会说,这会使代码更难阅读,因为它现在不必要地长了。我个人在B组,但我能理解A组。
一点mod而不是使用substring():
1 2 3 4 5 6 7 8 9 10 11 12 13
| //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();
} |
- 投票通过,因为您不需要添加任何库。
- 第7行:每个String使用两次.append()是否更好,而不是将它们连接起来,然后附加到构建器中。
正如最近的许多问题,Java 8的救援:
Java 8向EDCOX1 6增加了一个新的静态方法,它正好符合您的需要:
1
| public static String join (CharSequence delimeter, CharSequence... elements); |
使用它:
结果:
谷歌的番石榴图书馆也有这种能力。您还可以从API中看到字符串[]示例。
正如API中已经描述的,注意构建器方法的不可变性。
它可以接受一个对象数组,这样它就可以在您的情况下工作。在我以前的经验中,我尝试加入一个栈,它是一个不可更改的,并且工作正常。
我的样品:
1 2 3 4
| 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框架,那么就有了StringUtils类:
1 2 3 4
| import static org. springframework. util. StringUtils. arrayToDelimitedString;
arrayToDelimitedString (new String[] {"A", "B", "C
<hr><P>鉴于:</P>[cc lang="java "]String[] a = new String[] {"Hello ","World ","!" }; |
然后作为库伯德答案的替代,胶水在哪里":
1
| Arrays. asList(a ). toString(). replaceAll("^\\[|\\]$", "") |
或与其他字符串连接,如"&;amp;"。
1
| Arrays. asList(a ). toString(). replaceAll(",", " &"). replaceAll("^\\[|\\]$", "") |
然而。。。只有当您知道数组或列表中的值不包含字符串",
- Arrays.asList(a).toString()为我想做的事工作。
Not in core, no. A search for"java array join string glue" will give you some code snippets on how to achieve this though.
e.g.
- 使用StringBuilder(非线程安全)代替StringBuffer(线程安全),以获得更好的性能。接口是相同的。
- 有很多方法可以提高它的性能。
- 这似乎来自snippets.dzone.com/posts/show/91。这些注释建议一个改进了很多的版本:公共静态字符串联接(ITerable<?扩展对象>pcoll,字符串分隔符)迭代器<?扩展对象>oiter;if(pcoll==null(!(oiter=pcoll.iterator()).hasNext())返回";stringBuilder obuilder=new stringBuilder(string.valueof(oiter.next());while(oiter.hasNext())obuilder.append(separator.append(oiter.next());返回obuilder.toString();"
If you've landed here looking for a quick array-to-string conversion, try Arrays.toString().
Creates a String representation of the Object[] passed. The result is
surrounded by brackets ("[]"), each element is converted to a String
via the String.valueOf(Object) and separated by ",". If the array is
null, then "null" is returned.
- 非常感谢!琴弦之间用","分隔,整个东西周围有"[]",这对我来说很好。
只为"我有最短的一个"挑战,这里是我的;)
迭代:
1 2 3 4 5 6
| 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();
} |
递归的:
1 2 3
| 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())来说效率很低。
我就是这样做的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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();
} |
我不知道有什么内在的东西。
ApacheCommonsLang有一个名为StringUtils的类,它包含许多连接函数。
我的旋转。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 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, "");
} |
A similar alternative
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| /**
* @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();
} |
你喜欢我只使用string类方法的3行方式吗?
1 2 3 4 5
| 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
在使用函数Java库的情况下,由于某种原因无法使用Java 8的流(使用Android +RealLAMBDA插件时可能会出现这种情况),这是一个功能性解决方案:
1 2 3 4 5 6 7 8 9
| String joinWithSeparator (List <String > items, String separator ) {
return items
. bind(id -> list (separator, id ))
. drop(1)
. foldLeft(
(result, item ) -> result + item,
""
);
} |
请注意,这不是最有效的方法,但对于小的列表确实有效。
要从"str1"、"str2"、""中获取"str1,str2":
1
| Stream.of("str1","str2","").filter(str -> !str.isEmpty()).collect(Collectors.joining(",")); |
也可以添加额外的空检查
我使用一个StringBuilder这样做:
1 2 3 4 5 6 7 8 9 10 11
| 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) |
- s + delimiter(字符串与加号运算符串联)破坏了使用StringBuilder的全部目的。
- 另外,这种方法还意味着像:"foo"、"bar"with delimiter":"这样的数组将被转换为"foo:bar:"
There is simple shorthand technique I use most of the times..
1 2 3 4 5 6
| String op = new String;
for (int i : is )
{
op += candidatesArr [i -1]+",";
}
op = op. substring(0, op. length()-1); |
- 这只适用于长度为1的分隔符,如果需要不同长度的分隔符,则需要"幻数"(尽管非常局部)。
- 附加时可以添加多个字符
- 比简单的做:op=op.substring(0,op.length()-",".length());有什么大不了的?
java.util.array有一个"aslist"方法。再加上java.util.list/arraylist API,这就为您提供了所需的一切:;
1 2 3 4 5 6
| 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]);
} |
- 问题是如何用分隔符联接一个字符串数组,而不是如何将两个字符串数组联接在一起。