C#String.Format()和String.Join()的Java等价物

我知道这是一个新手问题,但在C#中的string操作是否等价于Java?

具体来说,我在谈论String.FormatString.Join

Java String对象有一个format方法(从1.5开始),但没有join方法。

为了得到一堆尚未包含的有用的String实用方法,可以使用org.apache.commons.lang.StringUtils 。

String.format 。 至于join,你需要写你自己的:

  static String join(Collection<?> s, String delimiter) { StringBuilder builder = new StringBuilder(); Iterator<?> iter = s.iterator(); while (iter.hasNext()) { builder.append(iter.next()); if (!iter.hasNext()) { break; } builder.append(delimiter); } return builder.toString(); } 

以上来自http://snippets.dzone.com/posts/show/91

番石榴来与Joiner类 。

 import com.google.common.base.Joiner; Joiner.on(separator).join(data); 

从Java 8开始, join()现在可以作为String类的两个类方法。 在这两种情况下,第一个参数是分隔符。

您可以传递单独的CharSequence作为附加参数 :

 String joined = String.join(", ", "Antimony", "Arsenic", "Aluminum", "Selenium"); // "Antimony, Arsenic, Alumninum, Selenium" 

或者你可以通过一个Iterable<? extends CharSequence> Iterable<? extends CharSequence>

 List<String> strings = new LinkedList<String>(); strings.add("EX"); strings.add("TER"); strings.add("MIN"); strings.add("ATE"); String joined = String.join("-", strings); // "EX-TER-MIN-ATE" 

Java 8还增加了一个新的类StringJoiner ,你可以这样使用它:

 StringJoiner joiner = new StringJoiner("&"); joiner.add("x=9"); joiner.add("y=5667.7"); joiner.add("z=-33.0"); String joined = joiner.toString(); // "x=9&y=5667.7&z=-33.0" 

TextUtils.join可在Android上使用

您也可以使用string的可变参数,如下所示:

  String join (String delim, String ... data) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < data.length; i++) { sb.append(data[i]); if (i >= data.length-1) {break;} sb.append(delim); } return sb.toString(); } 

至于join,我相信这可能看起来不那么复杂:

 public String join (Collection<String> c) { StringBuilder sb=new StringBuilder(); for(String s: c) sb.append(s); return sb.toString(); } 

我不太喜欢使用Java 5语法(信不信由你,我最近一直在使用1.0.x),所以我可能有点生疏,但我确定这个概念是正确的。

编辑添加:string追加速度可能会很慢,但是如果您正在处理GUI代码或一些短期运行的例程,那么如果您花费0.005秒或.006秒,则确实无关紧要,因此如果您有一个名为“joinMe”的集合,你想追加到一个现有的string“目标”,这不会是可怕的只是内联:

 for(String s : joinMe) target += s; 

这是非常低效的(和一个坏习惯),但不是任何你能够感知,除非有成千上万的string,或者这是在一个巨大的循环内,或者你的代码真的是性能的关键。

更重要的是,它很容易记住,简短,快速和可读性强。 性能并不总是deviseselect的自动赢家。

这是一个非常简单的答案。 使用+=因为代码less了,让优化器为你把它转换成一个StringBuilder 。 使用这种方法,您不必在循环中进行任何“最后”检查(性能改进),并且不必担心在最后剥离任何分隔符。

  Iterator<String> iter = args.iterator(); output += iter.hasNext() ? iter.next() : ""; while (iter.hasNext()) { output += "," + iter.next(); } 

我不想导入整个Apache库来添加一个简单的连接函数,所以这里是我的黑客。

  public String join(String delim, List<String> destinations) { StringBuilder sb = new StringBuilder(); int delimLength = delim.length(); for (String s: destinations) { sb.append(s); sb.append(delim); } // we have appended the delimiter to the end // in the previous for-loop. Let's now remove it. if (sb.length() >= delimLength) { return sb.substring(0, sb.length() - delimLength); } else { return sb.toString(); } } 

如果你想连接(连接)几个string到一个,你应该使用一个StringBuilder。 这比使用好得多

 for(String s : joinMe) target += s; 

由于StringBuilder不使用同步,所以还有一点胜过StringBuffer。

对于像这样的通用实用方法,在许多情况下(最终)会被调用很多次,所以应该使其高效,而不是分配许多瞬态对象。 我们已经分析了许多不同的Java应用程序,几乎总是发现string连接和string/ char []分配占用了大量的时间/内存。

我们的可重用集合 – > string方法首先计算所需结果的大小,然后创build一个具有该初始大小的StringBuilder; 这样避免了附加string时使用的内部char []的不必要的加倍/复制。

我写了自己的:

 public static String join(Collection<String> col, String delim) { StringBuilder sb = new StringBuilder(); Iterator<String> iter = col.iterator(); if (iter.hasNext()) sb.append(iter.next().toString()); while (iter.hasNext()) { sb.append(delim); sb.append(iter.next().toString()); } return sb.toString(); } 

但是JSP不支持Collection ,所以对于标签函数我写道:

 public static String join(List<?> list, String delim) { int len = list.size(); if (len == 0) return ""; StringBuilder sb = new StringBuilder(list.get(0).toString()); for (int i = 1; i < len; i++) { sb.append(delim); sb.append(list.get(i).toString()); } return sb.toString(); } 

并放到.tld文件中:

 <?xml version="1.0" encoding="UTF-8"?> <taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" <function> <name>join</name> <function-class>com.core.util.ReportUtil</function-class> <function-signature>java.lang.String join(java.util.List, java.lang.String)</function-signature> </function> </taglib> 

并在JSP文件中使用它:

 <%@taglib prefix="funnyFmt" uri="tag:com.core.util,2013:funnyFmt"%> ${funnyFmt:join(books, ", ")} 

StringUtils是Apache Commons Lang库中相当有用的一个类。

MessageFormat.format() ,它像C#的String.Format()

我在这里看到很多过于复杂的String.Join实现。 如果你没有Java 1.8,并且你不想导入一个新的库,下面的实现就足够了。

 public String join(Collection<String> col, String delim) { StringBuilder sb = new StringBuilder(); for ( String s : col ) { if ( sb.length() != 0 ) sb.append(delim); sb.append(s); } return sb.toString(); } 
 ArrayList<Double> j=new ArrayList<>; j.add(1); j.add(.92); j.add(3); String ntop=j.toString(); //ntop= "[1, 0.92, 3]" 

所以基本上,String ntop用逗号分隔符和括号来存储整个集合的值。

我只是使用string连接运算符“+”来join两个string。 s1 += s2;